我正在使用单元测试来测试 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吗?如果是的话,我错过了什么?