Как смоделировать вызовы функций в Python? - PullRequest
17 голосов
/ 28 сентября 2010

Я использую библиотеку mock , написанную Майклом Фурдом, чтобы помочь с моим тестированием в приложении django.

Я хотел бы проверить, правильно ли я настраиваю свой запрос, но я не думаю, что мне действительно нужно попасть в базу данных, поэтому я пытаюсь смоделировать запрос.

Я могу просто отлично смоделировать первую часть запроса, но не получаю желаемых результатов, когда включаю дополнительные элементы.

Функция:

    @staticmethod
    def get_policies(policy_holder, current_user):
        if current_user.agency:
            return Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct()
        else:
            return Policy.objects.filter(policy_holder=policy_holder)

и мой тест: первое утверждение проходит, второе не проходит.

    def should_get_policies_for_agent__user(self):
        with mock.patch.object(policy_models.Policy, "objects") as query_mock:
            user_mock = mock.Mock()
            user_mock.agency = "1234"
            policy_models.Policy.get_policies("policy_holder", user_mock)
            self.assertEqual(query_mock.method_calls, [("filter", (), {
                'policy_holder': "policy_holder",
                'version__agency': user_mock.agency,
            })])
            self.assertTrue(query_mock.distinct.called)

Я почти уверен, что проблема в том, что начальный query_mock возвращает новый макет после вызова .filter (), но я не знаю, как захватить этот новый макет и убедиться, что .distinct () был вызван на нем.

Есть ли лучший способ проверить то, что я пытаюсь получить? Я пытаюсь убедиться, что вызывается правильный запрос.

1 Ответ

18 голосов
/ 28 сентября 2010

Каждый фиктивный объект удерживает фиктивный объект, который он возвратил при вызове. Вы можете получить его, используя свойство return_value вашего фиктивного объекта.

Для вашего примера,

self.assertTrue(query_mock.distinct.called)

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

self.assertTrue(query_mock.filter.return_value.distinct.called)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...