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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:10:25