Migrate from requests
responses
Here's a few examples on how to migrate your code from the responses library to respx.
Patching the Client
Decorator
@responses.activate
def test_foo():
...
@respx.mock
def test_foo():
...
See Router Settings for more details.
Context Manager
def test_foo():
with responses.RequestsMock() as rsps:
...
def test_foo():
with respx.mock() as respx_mock:
...
See Router Settings for more details.
unittest setUp
def setUp(self):
self.responses = responses.RequestsMock()
self.responses.start()
self.addCleanup(self.responses.stop)
def setUp(self):
self.respx_mock = respx.mock()
self.respx_mock.start()
self.addCleanup(self.respx_mock.stop)
See unittest examples for more details.
Mock a Response
responses.add(
responses.GET, "https://example.org/",
json={"foo": "bar"},
status=200,
)
respx.get("https://example.org/").respond(200, json={"foo": "bar"})
See Routing Requests and Mocking Responses for more details.
Mock an Exception
responses.add(
responses.GET, "https://example.org/",
body=Exception("..."),
)
respx.get("https://example.org/").mock(side_effect=ConnectError)
See Exception Side Effect for more details.
Subsequent Responses
responses.add(responses.GET, "https://example.org/", status=200)
responses.add(responses.GET, "https://example.org/", status=500)
respx.get("https://example.org/").mock(
side_effect=[Response(200), Response(500)]
)
See Iterable Side Effect for more details.
Callbacks
def my_callback(request):
headers = {"Content-Type": "application/json"}
body = {"foo": "bar"}
return (200, headers, json.dumps(resp_body))
responses.add_callback(
responses.GET, "http://example.org/",
callback=my_callback,
)
def my_side_effect(request, route):
return Response(200, json={"foo": "bar"})
respx.get("https://example.org/").mock(side_effect=my_side_effect)
See Mock with a Side Effect for more details.
History and Assertions
History
responses.calls[0].request
responses.calls[0].response
respx.calls[0].request
respx.calls[0].response
request, response = respx.calls[0]
respx.calls.last.response
See Call History for more details.
Call Count
responses.assert_call_count("http://example.org/", 1)
route = respx.get("https://example.org/")
assert route.call_count == 1
See Call History for more details.
All Called
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
...
with respx.mock(assert_all_called=False) as respx_mock:
...
See Assert all Called for more details.
Modify Mocked Response
responses.add(responses.GET, "http://example.org/", json={"data": 1})
responses.replace(responses.GET, "http://example.org/", json={"data": 2})
respx.get("https://example.org/").respond(json={"data": 1})
respx.get("https://example.org/").respond(json={"data": 2})
Pass Through Requests
responses.add_passthru("https://example.org/")
respx.route(url="https://example.org/").pass_through()
See Pass Through for more details.
requests-mock
Decorator
@requests_mock.mock()
def test_some_call(self, m: requests_mock.mock):
m.get(requests_mock.ANY, json={})
@respx.mock()
def test_some_call(self, respx_mock: respx.Router):
respx_mock.get().respond(json={})
Context manager
with requests_mock.mock() as m:
m.get(requests_mock.ANY, json=json)
with respx.mock() as respx_mock:
respx_mock.get().respond(json=json)
Raising an exception
m.post(requests_mock.ANY, exc=JSONDecodeError("nope", "ok", 1))
respx.post().side_effect = JSONDecodeError("nope", "ok", 1)
Specifying a list of responses
m.get(requests_mock.ANY, responses)
respx.get().side_effect = responses
Assertions
self.assertTrue(m.called_once)
self.assertEqual(m.last_request.url, "https://api.io/example/endpoint")
self.assertEqual(m.last_request.json(), {"key": "value"})
respx.calls.assert_called_once()
self.assertEqual(
str(respx.calls.last.request.url),
"https://api.io/example/endpoint",
)
self.assertEqual(json.loads(respx.calls.last.request.content), {"key": "value"})