我正在对视图进行单元测试,并且尝试修补序列化器上的.data
属性,但是当many=True
kwarg传递给序列化器构造函数时,它的行为似乎有所不同正确打补丁。这是我的代码的一般示例。
# myapp/serializers.py
class MySerializer(serializers.Serializer):
some_field = serializers.CharField()
# myapp/views.py
class MyView(View):
def get(self, request):
# ..stuff
some_data = []
serializer = MySerializer(some_data, many=True)
print(type(serializer)) # <class 'rest_framework.serializers.ListSerializer'>
print(type(serializer.data)) # <class 'rest_framework.utils.serializer_helpers.ReturnList'>
return Response({"data": seralizer.data, status=200})
# in tests
def test_view_case_one(mocker):
# setup other mocks
serialized_data = mocker.patch("myapp.views.MySerializer.data", new_callable=mocker.PropertyMock)
# invoke view
response = MyView().get(fake_request)
# run assertions
serialized_data.assert_called_once() # this says it's never called
答案 0 :(得分:1)
之前,我遇到了尝试修补rest_framework.serializers.ListSerializer.data
的问题。必须是一个错字。重新尝试并能够成功修补。在这种情况下,many=True
将序列化程序重新创建为ListSerializer
,我只需要在基础类上修补属性。
serialized_data = mocker.patch(
"rest_framework.serializers.ListSerializer.data",
new_callable=mocker.PropertyMock
)
编辑:更深入的答案
使用many=True
时,__new__
上的BaseSerializer
方法会吸引您的类并从中构造一个ListSerializer
,这就是为什么我的对象显示为{{1 }}。由于实际上是在接收ListSerializer
而不是我们定义的类,因此补丁不会应用于ListSerializer
方法。 ListSerializer.data
的源代码的相关部分在下面
BaseSerializer