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
相关产品推荐
相关产品推荐

