在托管=假模型上模拟Django QuerySet - 单元测试

时间:2017-02-13 11:08:59

标签: python django unit-testing orm mocking

我正在使用单元测试来测试 Django 应用程序,我需要像这样模拟一个QuerySet。

def function_to_be_tested():
    qs = myModel.objects.get_last(param_1, param_2)
                                            .filter(category__in=[category_1, category_2])
    return qs

基于myModel

class myModel(models.Model):
    id = models.IntegerField(primary_key=True)
    category = models.CharField(max_length=255)
    ...

    objects = myModelManager()

    class Meta:
        managed = False
        ...

myModelManager

class myModelManager(models.manager):

    def get_last(self, param_1, param_2):
        # Do some stuff

在我尝试之后,使用 mock

with mock.patch('path.of.module.myModel.objects.get_last') as my_model_data:
    my_model_data.return_value = myModel.objects.none()
    result = module.function_to_be_tested()

此案例工作正常,因为返回一个空列表。现在,我想模拟QuerySet以返回一些数据。

with mock.patch('path.of.module.myModel.objects.get_last') as my_model_data:
    mock_data = mock.MagicMock(spec=myModel)
    mock_data.category = 'category_x'
    my_model_data.return_value = [mock_data]
    result = module.function_to_be_tested()

此尝试失败,并显示以下错误:

  

AttributeError:'list'对象没有属性'filter'

我知道发生这种情况是因为我只是在嘲笑 get_last 函数而不是所有的QuerySet。

我尝试将filter添加到这样的路径中:

with mock.patch('path.of.module.myModel.objects.get_last.filter') as my_model_data:

但提出

AttributeError: <bound method myModelManager.get_last of 
<path of.myModelManager object at 0x04EF49F0>> does not have the attribute 'filter'

有可能嘲笑这种QuesrySet吗?如果是的话,我错过了什么?

0 个答案:

没有答案