Не в состоянии смоделировать базу данных Django цепью запросов - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь издеваться над цепочкой запросов django.Это

 1. MyModel.objects.filter(userId=userId).exists()
 2. mrvDb = MyModel.objects.filter(userId=userId).order_by('-dateViewed')

.

Я пытаюсь насмехаться над Запросом 1. Ниже мой подход к подходу

   @mock.patch('myapp.models.MyModel.objects')
   @mock.patch('myapp.models.MyModel.objects')
   def test_retrieveMRVListService(self, param, most_Recently_Viewed_List):

      mock_MRVList_data = mock.MagicMock(spec=MyModel)
      mock_MRVList_data.userId = 6
      mock_MRVList_data.policyId = 6
      most_Recently_Viewed_List.filter.return_value = [mock_MRVList_data]  

    # param.filter.return_value = param
    param.filter.exists.return_value = "True"

Для этого.Я получаю сообщение об ошибке: (AttributeError: у объекта «список» нет атрибута «существует»)

Я пытаюсь проверить этот метод.

def retrieveMRVListService(userId):
    if mostRecentlyViewedList.objects.filter(userId=userId).exists():
        mrvDb = mostRecentlyViewedList.objects.filter(
            userId=userId
            ).order_by('-dateViewed')[:5]
        mrvList = []
        for mrv in mrvDb:
            mrvData = {}
            mrvData["userId"] = mrv.userId
            mrvData["policyId"] = mrv.policyId
            mrvList.append(mrvData)
    else:
        mrvList = []
    return mrvList

Я новичок в unittest и mock /тестовые запросы django.Может ли кто-нибудь помочь решить цепочку запросов.Любая помощь или руководство, я буду очень признателен.Пожалуйста, дайте мне знать, если требуется какая-либо информация.

1 Ответ

0 голосов
/ 01 мая 2019

Вы уже проделали большую часть работы, что на самом деле удивительно, так как большинство людей в Python даже не знают, как использовать Mock. То, что на самом деле сбивает вас с толку, это то, что most_Recently_Viewed_List.filter.return_value на самом деле List, и он правильно говорит, что у него нет атрибута «существует» (потому что его нет).

Итак, разбив его по шагам:

  1. MyModel.objects.filter (userId = userId) возвращает объект QuerySet.
  2. Затем вы вызываете 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

Как вы можете видеть, то, что мы на самом деле делаем сейчас, это насмешка над тем, что вы вызывали в своем коде.

...