Как издеваться над цепочками вызовов функций в python?
Я использую библиотеку 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)
Я уверен, что проблема в том, что начальный запрос_мак возвращает новый макет после вызова .filter(), но я не знаю, как записать этот новый макет и убедиться, что был вызван .distinct() на нем.
Есть ли лучший способ проверить, на что я пытаюсь попасть? Я пытаюсь убедиться, что вызывается правильный запрос.
Ответы
Ответ 1
Каждый макет объекта держится на макет, который он возвращает при его вызове. Вы можете получить это, используя свойство mook object return_value.
В вашем примере
self.assertTrue(query_mock.distinct.called)
different не был вызван на ваш макет, он был вызван на возвращаемое значение метода фильтра вашего макета, поэтому вы можете утверждать, что этот вызов был вызван следующим образом:
self.assertTrue(query_mock.filter.return_value.distinct.called)