You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:10:52