Skip to content

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"})