如何为含LoginRequiredMixin和UserPassesTestMixin的Django视图编写测试?
测试FeatureListView的方案
一、测试前置准备
使用Django的TestCase编写测试,需提前初始化测试数据:
- 导入依赖:
from django.test import TestCase、from django.contrib.auth.models import User, Group、from django.urls import reverse、from .models import FeatureFilm - 在
setUp方法中创建测试用的用户组、电影数据,避免重复代码
二、核心测试场景
1. 未登录用户访问
未登录用户触发LoginRequiredMixin校验,最终重定向到access-denied页面:
def test_unauthenticated_user_redirects(self): url = reverse("feature-list") response = self.client.get(url) self.assertRedirects(response, reverse("access-denied"))
2. 已登录但无权限用户访问
登录用户不属于Administrator/Supervisor/Operator任何一组时,同样被重定向:
def test_authenticated_non_permitted_user_redirects(self): # 创建无权限用户并登录 user = User.objects.create_user(username="testuser", password="testpass123") self.client.login(username="testuser", password="testpass123") url = reverse("feature-list") response = self.client.get(url) self.assertRedirects(response, reverse("access-denied"))
3. 已登录且有权限用户访问
分别验证三个允许组的用户能正常访问列表页:
def test_administrator_access(self): admin_group = Group.objects.get(name="Administrator") user = User.objects.create_user(username="admin", password="admin123") user.groups.add(admin_group) self.client.login(username="admin", password="admin123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html") def test_supervisor_access(self): supervisor_group = Group.objects.get(name="Supervisor") user = User.objects.create_user(username="super", password="super123") user.groups.add(supervisor_group) self.client.login(username="super", password="super123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html") def test_operator_access(self): operator_group = Group.objects.get(name="Operator") user = User.objects.create_user(username="operator", password="operator123") user.groups.add(operator_group) self.client.login(username="operator", password="operator123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html")
三、模板内容验证
校验模板是否正确渲染FeatureFilm数据:
def test_template_renders_film_data(self): admin_group = Group.objects.get(name="Administrator") user = User.objects.create_user(username="admin", password="admin123") user.groups.add(admin_group) self.client.login(username="admin", password="admin123") # 创建测试电影 test_film = FeatureFilm.objects.create(title="Test Action Movie", director="John Doe") url = reverse("feature-list") response = self.client.get(url) # 验证页面包含电影标题和导演信息 self.assertContains(response, test_film.title) self.assertContains(response, test_film.director)
四、完整测试类示例
from django.test import TestCase from django.contrib.auth.models import User, Group from django.urls import reverse from .models import FeatureFilm class FeatureListViewTests(TestCase): def setUp(self): # 初始化用户组 Group.objects.create(name="Administrator") Group.objects.create(name="Supervisor") Group.objects.create(name="Operator") # 初始化测试电影 FeatureFilm.objects.create(title="Sample Drama", director="Jane Smith") def test_unauthenticated_user_redirects(self): url = reverse("feature-list") response = self.client.get(url) self.assertRedirects(response, reverse("access-denied")) def test_authenticated_non_permitted_user_redirects(self): user = User.objects.create_user(username="testuser", password="testpass123") self.client.login(username="testuser", password="testpass123") url = reverse("feature-list") response = self.client.get(url) self.assertRedirects(response, reverse("access-denied")) def test_administrator_access(self): admin_group = Group.objects.get(name="Administrator") user = User.objects.create_user(username="admin", password="admin123") user.groups.add(admin_group) self.client.login(username="admin", password="admin123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html") def test_supervisor_access(self): supervisor_group = Group.objects.get(name="Supervisor") user = User.objects.create_user(username="super", password="super123") user.groups.add(supervisor_group) self.client.login(username="super", password="super123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html") def test_operator_access(self): operator_group = Group.objects.get(name="Operator") user = User.objects.create_user(username="operator", password="operator123") user.groups.add(operator_group) self.client.login(username="operator", password="operator123") url = reverse("feature-list") response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, "project/feature-list.html") def test_template_renders_film_data(self): admin_group = Group.objects.get(name="Administrator") user = User.objects.create_user(username="admin", password="admin123") user.groups.add(admin_group) self.client.login(username="admin", password="admin123") test_film = FeatureFilm.objects.create(title="Test Action Movie", director="John Doe") url = reverse("feature-list") response = self.client.get(url) self.assertContains(response, test_film.title) self.assertContains(response, test_film.director)
内容的提问来源于stack exchange,提问作者gomez_
相关产品推荐
相关产品推荐

