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

Django序列化单元测试触发Assertion Error问题排查求助

问题原因
  • 序列化器入参格式错误:DRF Serializer的data参数要求传入包含所有声明字段的键值对字典,你的测试代码直接传入文件内容字典,既缺少必填的file、format字段,也没有传入文件对象本身。
  • 序列化器校验逻辑错误:validate方法接收的data参数是所有字段校验后的字典,不是文件对象,原代码直接调用data.read()属于属性不存在的逻辑错误,应该先从data中取出file字段再调用read()方法。
  • Mock对象不符合预期:你给File Mock只加了content属性,没有实现read()方法,同时json.loads()要求传入JSON字符串,直接传入Python字典会抛出类型错误。
  • 补充遗漏逻辑:DRF的validate方法需要返回校验完成的数据,原代码没有返回值会导致后续逻辑异常。
修复方案

修正 serializer.py

class Serializer(serializers.Serializer):
      file = serializers.FileField(required=True)
      format = serializers.CharField(required=True)

      def validate(self, data):
          # 从字段字典中取出文件对象后再读取内容
          file_content = data['file'].read()
          is_valid, message = Validation().is_valid(
              json.loads(file_content))
          if not is_valid:
              raise serializers.ValidationError(message)
          # 返回校验后的数据
          return data

修正 tests.py

import json
from unittest import mock
from django.core.files import File

class Validation(TestCase):
    def test_valid_serializer(self):
        # 构造测试用的JSON内容
        test_content = {
            'mockData': [{
                "id": 1,
                "name": "blue",
            }] 
        }
        file_mock = mock.MagicMock(spec=File)
        file_mock.name = 'mock.json'
        # 实现read方法,返回JSON序列化后的字符串
        file_mock.read.return_value = json.dumps(test_content)
        # 传入包含所有必填字段的字典作为data参数
        serializer = Serializer(data={
            'file': file_mock,
            'format': 'json'
        })
        assert serializer.is_valid() is True
        assert serializer.errors == {}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:36:03