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

