Testing an API client written with tiny-api-client
is not straightforward out of the box.
The reason for this is that decorators cannot be patched after the functions they decorate
have been imported. To remediate this issue, a companion pytest plugin is available.
pip install pytest-tiny-api-client
This plugin exposes a pytest fixture api_call
, which replaces
the usual implementation of the api decorators.
Thus, your api endpoints will receive the return value of this fixture as
their response argument, instead of the actual api result.
The fixture is an instance of unittest.mock.Mock
.
This mock accepts an endpoint argument, and arbitrary keyword arguments, which
are passed directly from the method decorator of your endpoint definition.
Thus, you can use the mock assertions to check that your endpoint is passing
the right arguments to the decorator.
from my_api import MyClient def test_my_client(api_call): # set your fake api response api_call.return_value = [{"id": 0, "name": "Mary Jane"}, ...] # make your calls client = MyClient() users = client.fetch_users() # make assertions assert users[0].name == "Mary Jane"
In some circumstances it might not be possible to use a function-scoped fixture.
One example of this is when using the property-based testing library hypothesis
.
It is still possible to use a context manager to temporarily patch the api call.
from unittest.mock import patch def test_my_client(): with patch('pytest_tiny_api_client._api_call') as api_call: ...
If you are not using pytest, or you don't want to use the plugin, all you have to
do is to patch tiny_api_client.{method}
where method is one of the http method
decorators. This patch must occur before your api module is imported.
Another option is to call importlib.reload(module)
where module is your api module.
For more information on how to do this, check this stackoverflow question. By far easier, though, is to see how this plugin is implemented, and replicate this behaviour in your own project.