I’m trying to obtain different responses by each call on a Mock by using the side_effect
attribute. However, I’m obtaining the first one each time. I would like to ask if I can get any help on it. Thank you in advance
import json
from typing import Dict
from unittest.mock import Mock, patch
import requests
def mock_response_1() -> dict:
return {"data": {"users": [{"id": "AAA"}]}}
def mock_response_2() -> dict:
return {"data": {"users": [{"id": "BBB"}]}}
def mock_json_response(mocked_json: Dict, status_code: int = 200) -> Mock:
response_mock = Mock()
response_mock.configure_mock(**{
"return_value.status_code": status_code,
"return_value.headers": {"Content-Type": "application/json"},
"return_value.json.return_value": mocked_json,
"return_value.text.return_value": json.dumps(mocked_json),
})
return response_mock()
class ApiClient:
def get_response(self) -> dict:
request_r = requests.get(url="https://api.test.com")
request_r = request_r.json()
return request_r.get("data")
class MockClient(ApiClient):
@patch('ApiTest.requests.get')
def get_response(self, mocked_post: Mock):
mocked_post.side_effect = iter([
mock_json_response(mock_response_1()),
mock_json_response(mock_response_2())
])
return super().get_response()
class TestApiClient:
client = MockClient()
def test_get_response(self):
for i in (0, 1):
print(f"Iteration {i}: {self.client.get_response()}")
Result:
Iteration 0: {'users': [{'id': 'AAA'}]}
Iteration 1: {'users': [{'id': 'AAA'}]}