Python 在Django中模拟临时上载的文件

Python 在Django中模拟临时上载的文件,python,django,unit-testing,file-upload,mocking,Python,Django,Unit Testing,File Upload,Mocking,我正在使用Django(1.10.5)和DRF(3.5.4)来创建API。我已经定义了一个视图来处理文件上传,并使用post请求中传递的数据和存储上传文件的临时文件路径调用foo方法 class FooView(APIView): parser_classes = (FormParser, MultiPartParser) def post(self, request, format=None): serializer = NewFooSerializer(da

我正在使用Django(1.10.5)和DRF(3.5.4)来创建API。我已经定义了一个视图来处理文件上传,并使用post请求中传递的数据和存储上传文件的临时文件路径调用
foo
方法

class FooView(APIView):
    parser_classes = (FormParser, MultiPartParser)

    def post(self, request, format=None):
        serializer = NewFooSerializer(data=request.data)
        if serializer.is_valid():
            file_obj = serializer.validated_data["my_file"]
            name = serializer.validated_data["name"]
            foo_id = my_module.foo(name=name, my_file=file_obj.temporary_file_path())
            result_url = reverse('api:foo', kwargs={"foo_id": foo_id})
            return Response({"result_url": result_url}, status=status.HTTP_202_ACCEPTED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
验证传入数据的序列化程序如下所示

class NewFooSerializer(serializers.Serializer):
    name = serializers.CharField()
    my_file = serializers.FileField()
基本上,我想使用
mock
library在没有文件系统交互的情况下测试这个视图。我目前的测试方法定义如下

    @mock.patch('my_module.foo')
    def test_post_should_invoke_foo_method(self, mocked_foo):
        mocked_foo.return_value = "123456"
        self.client.post(self.VIEW_URL,
                         {'my_file': self.file_mock,
                          'name': 'Test file'
                          }, format='multipart')
        mocked_new.assert_called_with(name="Test file", my_file="/some/dummy/path"
这当然会引发断言错误

AssertionError: Expected call: foo(my_file='/some/dummy/path', name='Test file')
Actual call: foo(my_file='/tmp/tmp0VrYgR.upload', name=u'Test file')
我找不到任何解决方案来模拟
临时上载文件
,因此我尝试模拟该类正在使用的
tempfile.NamedTemporaryFile
。所以我在
TestCase

named_temporary_file_mock = mock.MagicMock(spec=tempfile.NamedTemporaryFile)
named_temporary_file_mock.name = mock.MagicMock()
named_temporary_file_mock.name.return_value = "/some/dummy/path"
然后用

@mock.patch('tempfile.NamedTemporaryFile', named_temporary_file_mock)
但不幸的是,这会导致与以前版本相同的错误。我可能错过了什么?我应该采取另一种方法来避免与文件系统的交互吗