Python Django Rest框架:当序列化程序';在序列化程序\u类属性中使用了?
我有一个带有create()函数的序列化程序。当我执行POST请求时,我希望调用此函数并创建一个新对象。当我在浏览器中执行此操作时,它会工作,并且还会调用该函数。但是在测试内部,它表示函数没有被调用。我认为我对补丁做了一些错误,因为在API中,它只被设置为一个序列化程序\类,并且该类可能在框架内的某个地方被调用。另一个想法是,我不需要对此进行测试,因为rest_框架应该保证,如果我这样做,框架应该使用正确的参数调用函数Python Django Rest框架:当序列化程序';在序列化程序\u类属性中使用了?,python,django-rest-framework,python-3.4,python-unittest,django-1.9,Python,Django Rest Framework,Python 3.4,Python Unittest,Django 1.9,我有一个带有create()函数的序列化程序。当我执行POST请求时,我希望调用此函数并创建一个新对象。当我在浏览器中执行此操作时,它会工作,并且还会调用该函数。但是在测试内部,它表示函数没有被调用。我认为我对补丁做了一些错误,因为在API中,它只被设置为一个序列化程序\类,并且该类可能在框架内的某个地方被调用。另一个想法是,我不需要对此进行测试,因为rest_框架应该保证,如果我这样做,框架应该使用正确的参数调用函数 # serializers.py class FooSerializer(m
# serializers.py
class FooSerializer(models.ModelSerializer):
class Meta:
...
def create(self, validated_data):
...
# apis.py
class FooAPI(generics.CreateAPIView):
serializer_class = FooSerializer
# tests.py
@patch('apis.FooSerializer'):
def test_that_create_is_called(self, mock):
mock.create = MagicMock()
mock.create.return_value = Foo() # Foo is my model
response = self.client.post('/foo', {name: 'Test'})
self.assertTrue(mock.create.called) # => Output says "False is not true"
您当前的代码正在模拟整个序列化程序对象,这可能是杀伤力过大,如果希望序列化程序上的内部逻辑调用create方法,则可能会停止调用该方法 相反,您只需要修补单个方法-如下所示:
@patch('apis.FooSerializer', 'create')
现在,您的测试方法接收已替换create方法的MagicMock对象实例
因此,您的测试方法变成:
def test_that_create_is_called(self, mock_method):
response = self.client.post('/foo', {name: 'Test'})
self.assertTrue(mock_method.called)
您不应该将修补过的对象称为“mock”,因为这是python内置模块的名称,因此会发生冲突。我认为错误在补丁的路径中,可能应该是
my_module.api.FooSerializer
。从mock的模型文档中,感谢您的回答!当我看到这个答案时,我已经更改了代码,现在我无法复制它,所以我不能说这个答案是否解决了我的问题。。。不过还是要谢谢你:)