Вы уже проделали большую часть работы, что на самом деле удивительно, так как большинство людей в Python даже не знают, как использовать Mock. То, что на самом деле сбивает вас с толку, это то, что most_Recently_Viewed_List.filter.return_value
на самом деле List
, и он правильно говорит, что у него нет атрибута «существует» (потому что его нет).
Итак, разбив его по шагам:
- MyModel.objects.filter (userId = userId) возвращает объект
QuerySet
.
- Затем вы вызываете
exists()
в QuerySet, который был возвращен на шаге 1.
Так что, когда вы исправляете / копируете объект, вы должны правильно отслеживать, что на самом деле вызывается и где.
Вместо этого вы можете вернуть другой макет на шаге 1, а затем изменить вызовы возврата этого объекта, как если бы он был тем оригиналом QuerySet
:
mock_queryset = Mock() # Create a mock of the QuerySet
# in Django calling filter() returns a QuerySet, so lets do that
most_Recently_Viewed_List.filter.return_value = mock_queryset
# now modify the return value for the calls you make on that queryset
mock_queryset.exists.return_value = True
mock_queryset.order_by.return_value = [mock_MRVList_data] # just like your original code
Как вы можете видеть, то, что мы на самом деле делаем сейчас, это насмешка над тем, что вы вызывали в своем коде.