如何修复Django测试用例中的AssertionError 400断言错误?
问题描述
我正在开发一个Django项目,为下述Meeting模型编写测试用例:
class Meeting(models.Model): team = models.OneToOneField("Team", on_delete=models.CASCADE) created_at = models.DateTimeField() def __str__(self) -> str: return self.team.name
测试用例代码如下:
class MeetingTestCase(BaseTestCase): def test_meeting_post(self): self.client.force_login(self.owner) meeting_data = { "team": self.team.id, "created_at": "2023-01-12T01:52:00+05:00" } response = self.client.post("/api/meeting/", data=meeting_data) self.assertEqual(response.status_code, status.HTTP_201_CREATED)
在setup()函数中,已创建team对象:
self.team = factories.TeamFactory(name="Team", organization=self.organization)
工厂类代码为:
class TeamFactory(factory.django.DjangoModelFactory): class Meta: model = models.Team
但测试用例执行失败,出现断言错误:
self.assertEqual(response.status_code, status.HTTP_201_CREATED) AssertionError: 400 != 201
请求存在问题,请问哪里操作有误?
排查与解决方向
- OneToOneField唯一性冲突:
Meeting的team是一对一字段,如果该team已经关联过Meeting对象,再次创建就会触发唯一性校验失败。测试前先检查Meeting.objects.filter(team=self.team).exists(),存在则删除。 - 请求数据格式不匹配:如果API用DRF且期望JSON格式,直接传
data是表单数据,会导致解析失败。改用JSON格式请求:import json response = self.client.post( "/api/meeting/", data=json.dumps(meeting_data), content_type='application/json' ) - 查看响应错误详情:在断言前打印
response.data,能看到具体的校验失败原因,比如字段缺失、格式错误等:print(response.data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - Team对象完整性问题:如果
Team模型有其他必填字段,TeamFactory未设置默认值的话,创建的team可能处于无效状态,导致关联Meeting时校验失败。给TeamFactory补充必填字段默认值:class TeamFactory(factory.django.DjangoModelFactory): class Meta: model = models.Team name = factory.Faker('company') organization = factory.SubFactory(OrganizationFactory) - 权限或序列化器配置问题:确认登录用户
self.owner有创建Meeting的权限,同时检查序列化器是否正确处理team和created_at字段,比如created_at是否设为可写,是否有未声明的校验规则。
内容的提问来源于stack exchange,提问作者Waleed Farrukh
相关产品推荐
相关产品推荐

