Tengo una vista que realiza una llamada API de terceros:
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 Mi intención es burlarme solo de la función atoca_api_call() y no de toda la vista.
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 La prueba funciona bien, pero atoca_api_call() no se burla. Soy consciente de dónde parchear :
@patch('crm.views.atoca_api_call', autospec=True) Genera un 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.Probablemente sea un problema simple que no capto por inexperiencia, cualquier ayuda es realmente apreciada.
Como veo atoca_api_call() se burla. El problema es el valor de retorno.
mock_atoca_api_call.return_value = MagicMock( status_code=200, response=some_json # just returns some json ) Esto debería tener una respuesta adecuada, supongo que una respuesta JsonResponse o Response(data) no estoy seguro de qué está devolviendo. Prueba con:
mock_atoca_api_call.return_value = JsonResponse( some_json # just returns some json )