Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架:当序列化程序';在序列化程序\u类属性中使用了?_Python_Django Rest Framework_Python 3.4_Python Unittest_Django 1.9 - Fatal编程技术网

Python Django Rest框架:当序列化程序';在序列化程序\u类属性中使用了?

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

我有一个带有create()函数的序列化程序。当我执行POST请求时,我希望调用此函数并创建一个新对象。当我在浏览器中执行此操作时,它会工作,并且还会调用该函数。但是在测试内部,它表示函数没有被调用。我认为我对补丁做了一些错误,因为在API中,它只被设置为一个序列化程序\类,并且该类可能在框架内的某个地方被调用。另一个想法是,我不需要对此进行测试,因为rest_框架应该保证,如果我这样做,框架应该使用正确的参数调用函数

# 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的模型文档中,感谢您的回答!当我看到这个答案时,我已经更改了代码,现在我无法复制它,所以我不能说这个答案是否解决了我的问题。。。不过还是要谢谢你:)