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

Django单元测试编写求助:验证学生面板作业过滤查询结果正确性

Django学生作业视图单元测试实现

以下实现完全基于Django内置的django.test模块,无需额外第三方依赖,直接放到你的home/tests.py文件中即可:

from django.test import TestCase, Client
from django.contrib.auth import get_user_model
from .models import Assignment, Test  # 若作业关联的模型名称不是Test,对应修改
import datetime
from datetime import timedelta

User = get_user_model()

class StudentAssignmentViewTest(TestCase):
    def setUp(self):
        # 初始化测试客户端
        self.client = Client()
        # 创建测试学生用户,若你使用自定义用户模型,对应调整类型字段赋值逻辑
        self.student = User.objects.create_user(
            username='test_student',
            password='testpass123'
        )
        # 匹配业务代码中的学生类型判断规则
        self.student.type.text = 'Student'
        self.student.type.save()
        self.student.save()

        today = datetime.date.today()
        # 构造4种边界场景的作业数据
        # 1. 昨日开始、未完成:符合条件,且是最早开始的作业
        self.assignment1 = Assignment.objects.create(
            student=self.student,
            start_date=today - timedelta(days=1),
            completed=False,
            test=Test.objects.create(name='测试作业1')  # 补充Test模型的必填字段即可
        )
        # 2. 今日开始、未完成:符合条件
        self.assignment2 = Assignment.objects.create(
            student=self.student,
            start_date=today,
            completed=False,
            test=Test.objects.create(name='测试作业2')
        )
        # 3. 明日开始、未完成:不符合时间条件
        self.assignment3 = Assignment.objects.create(
            student=self.student,
            start_date=today + timedelta(days=1),
            completed=False,
            test=Test.objects.create(name='测试作业3')
        )
        # 4. 昨日开始、已完成:不符合完成状态条件
        self.assignment4 = Assignment.objects.create(
            student=self.student,
            start_date=today - timedelta(days=1),
            completed=True,
            test=Test.objects.create(name='测试作业4')
        )

    def test_assignment_filter_rule(self):
        """校验仅返回开始日期<=当日且未完成的作业"""
        self.client.login(username='test_student', password='testpass123')
        # 若你的index视图路由不是根路径,对应修改get的参数
        response = self.client.get('/')
        
        # 先校验数据库层面的过滤结果正确
        valid_assignments = Assignment.objects.filter(
            student=self.student,
            start_date__lte=datetime.date.today(),
            completed=False
        )
        self.assertEqual(valid_assignments.count(), 2)
        # 校验视图返回的作业属于有效范围
        self.assertIn('test_pk', response.context)
        self.assertIn(response.context['test_pk'], [self.assignment1.test.pk, self.assignment2.test.pk])

    def test_return_earliest_assignment_first(self):
        """校验仅返回符合条件的作业列表中最早开始的第一条"""
        self.client.login(username='test_student', password='testpass123')
        response = self.client.get('/')
        self.assertEqual(response.context['test_pk'], self.assignment1.test.pk)

    def test_no_valid_assignment_return_empty_context(self):
        """额外覆盖无符合条件作业时,返回空上下文的场景"""
        # 把所有有效作业标记为已完成
        Assignment.objects.filter(
            student=self.student,
            start_date__lte=datetime.date.today(),
            completed=False
        ).update(completed=True)
        
        self.client.login(username='test_student', password='testpass123')
        response = self.client.get('/')
        self.assertEqual(response.context, {})

使用说明

  • 代码中涉及用户类型、路由路径、关联模型字段的部分,若和你的实际业务代码不一致,对应调整即可
  • 执行测试的命令为:python manage.py test home

内容的提问来源于stack exchange,提问作者Kristen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:02