Я использую декоратор 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
...