Django Rest Framework无法在视图测试中修补Serializer(many = True).data

时间:2018-09-13 18:09:14

标签: python django django-rest-framework pytest

我正在对视图进行单元测试,并且尝试修补序列化器上的.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 

1 个答案:

答案 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