Невозможно сымитировать вызов стороннего api
У меня есть представление, которое выполняет вызов API третьей стороны:
from .atoca_api_calls import atoca_api_call
def atoca_api_call_view(request):
# some code
data = atoca_api_call(**params) # the actual API call happens in this func
# some code
Мое намерение состоит в том, чтобы высмеять только функцию atoca_api_call()
, а не все представление.
class AtocaTestCase(TestCase):
def setUp(self):
# some code
@patch('crm.atoca_api_calls.atoca_api_call')
def test_atoca_call(self, mock_atoca_api_call):
mock_atoca_api_call.return_value = MagicMock(
status_code=200,
response=some_json # just returns some json
)
url = reverse('crm:atoca-api-call') # url related to `atoca_api_call_view`
response = self.client.post(url, some_others_params)
# various asserts
Тест работает нормально, но atoca_api_call()
не подделывается.
Я знаю где можно поставить патч :
@patch('crm.views.atoca_api_call', autospec=True)
Поднимает ValueError
:
ValueError: Failed to insert expression "<MagicMock name='mock.__getitem__().__getitem__().__getitem__()().resolve_expression()' id='140048216397424'>" on crm.Company.atoca_id. F() expressions can only be used to update, not to insert.
Возможно, это простая проблема, которую я не уловил по неопытности, любая помощь будет очень признательна.
Как я вижу atoca_api_call()
, это издевательство. Проблема заключается в возвращаемом значении.
mock_atoca_api_call.return_value = MagicMock(
status_code=200,
response=some_json # just returns some json
)
Это должен быть правильный ответ, я предполагаю JsonResponse
или Response(data)
не уверен, что вы возвращаете. Попробуйте с:
mock_atoca_api_call.return_value = JsonResponse(
some_json # just returns some json
)