django 我正在使用python @mock.patch装饰器,我想设置一个查询的return_value,如model. objects. filter,如何设置此类查询的return_value

xu3bshqb  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(102)

我的模特

class Mymodel(models.Model):
  name = models.CharField()
  age = models.IntegerField()

例如,在我的视图中,我使用此模型作为

class MyView(generics.ListAPIView):
  serializerClass = MySerrializer
  
  def get(self, req, *args, **kwargs):
    res = Mymodel.objects.filter(age=25)
    serializer = self.get_serializer(res, many=true)
    return Response(serializert.data)

我正在为这个视图写一个测试用例

@mock.patch('views.Mymodel.objects.filter')
def test_MyView(filtered_result):
  filtered_result.return_value = ???

现在我应该如何设置返回值,如果它是一个Mymodel.objects.get我会像这样设置

filtered_result.return_value = Mymodel(name="xyz", age=30)

现在,对于Mymodel.objects.filter,我是否必须在django QuerySet中打包一些Mymodel示例?

xqkwcwgp

xqkwcwgp1#

要做到这一点,你可以在打补丁之前创建一个假模型,假设你没有任何数据进行测试,你可以为过滤器创建一个新的模型示例:

class FakeModel:
    @staticmethod
    def filter():
        return Mymodel.objects.create(name="xyz", age=30)

然后将这个FakeModel作为return_value=FakeModel()传递给你的补丁。
因此,您将为mock_my_model变量传递该值。
最后,您可以将此mock_my_model变量传递给mock_my_model.filter.return_value

@mock.patch(
    'apis.views.Mymodel.objects.filter',
    return_values=FakeModel(),
)
def test_MyView(mock_my_model):
  mock_my_model.filter.return_value = mock_my_model
  ...

相关问题