Я использую patch
из unittest.mock
, чтобы изменить поведение удаленного вызова API в моем тесте.
У меня есть три разные функции, которые возвращают три разных json
файла, которые представляют макетданные, которые будут возвращены из API.Для каждого ложного вызова API я устанавливаю side_effect
в качестве одной из этих функций.Этот шаблон не СУХОЙ, но я не знаю, как передать параметр в side_effect
функцию.
Три функции вызова фиктивного API выглядят так:
def mock_api_call_1():
with open('path/to/mock_1.json') as f:
mock_data = json.load(f)
return mock_data
Вот мой тест
class MyTest(TestCase):
def test_api(self):
with patch('mymodule.utils.api_call', side_effect=mock_api_call_1):
do_crud_operations()
self.assertEqual(MyModel.objects.all().count(), 10)
with patch('mymodule.utils.api_call', side_effect=mock_api_call_2):
do_crud_operations()
self.assertEqual(MyModel.objects.all().count(), 11)
Как мне выполнить рефакторинг этого кода, чтобы можно было передавать параметр в side_effect
(mock_call(1)
вместо mock_call_1
).
Из unittest docs , я вижу, что:
side_effect: функция, которая вызывается всякий раз, когда вызывается Mock.Смотрите атрибут side_effect.Полезно для возбуждения исключений или динамического изменения возвращаемых значений.Функция вызывается с теми же аргументами, что и макет, и, если она не возвращает DEFAULT, возвращаемое значение этой функции используется в качестве возвращаемого значения.
Я вижу, что функция передана в side_effect
принимает те же аргументы, что и макет, но я все еще не уверен, как лучше использовать макет для достижения этой цели.В конечном итоге я захочу добавить больше тестовых случаев, поэтому я не хочу жестко кодировать различные mock_api_call
функции.