Невозможно сымитировать вызов стороннего 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
)
Вернуться на верх