Я использую декоратор python @mock.patch, я хочу установить возвращаемое_значение для запроса типа model.objects.filter. Как установить значение return_value для такого запроса?

Например, моя модель

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 Нужно ли мне упаковывать некоторые экземпляры Mymodel в django QuerySet ?

Для этого вы можете создать фальшивую модель перед патчем, предположим, что у вас нет данных для тестирования, вы можете создать новый экземпляр модели для фильтра:

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
  ...

Вернуться на верх