A static HTTP mock interface for testing classes that leverage Python requests with no monkey patching!
- Free software: Apache 2 License
- Documentation: https://requests-staticmock.readthedocs.org.
.. automodule:: requests_staticmock.context :members: mock_session_with_fixtures
import requests
import requests_staticmock
session = requests.Session()
with requests_staticmock.mock_session_with_fixtures(session, 'tests/fixtures', 'http://test_context.com'):
# will return a response object with the contents of tests/fixtures/test.json
response = new_session.request('get', 'http://test_context.com/test.json')
You can inject the requests_staticmock adapter into an existing (or new) requests session to mock out a particular URL or domain, e.g.
import requests
from requests_staticmock import Adapter
session = requests.Session()
special_adapter = Adapter('fixtures')
session.mount('http://specialwebsite.com', special_adapter)
session.request('http://normal.com/api/example') # works as normal
session.request('http://specialwebsite.com') # returns static mocks
Instead of using a static asset adapter, you can use an adapter that expects an internal method to respond with a string, e.g.
GET /test/example.xml will call method _test_example_xml(self, request)
GET /test/example.xml?query=param will call method _test_example_xml(self, request)
This can be used via requests_staticmock.ClassAdapter or the context manager
.. automodule:: requests_staticmock.context :members: mock_session_with_class
import requests
import requests_staticmock
class MyTestClass(requests_staticmock.BaseMockClass):
def _api_v1_idea(self, request):
return "woop woop"
session = requests.Session()
with requests_staticmock.mock_session_with_class(session, MyTestClass, 'http://test_context.com'):
# will return a response object with the contents 'woop woop'
response = new_session.request('get', 'http://test_context.com/api/v1/idea')
The class adapter supports unpacking of the following components, just add these keyword arguments to your callback methods and the class adapter will match them to the arguments.
- method - The HTTP verb, e.g. GET
- url - The full URL
- params - The dict with the request parameters
- headers - The request headers
- body - The request body text
import requests
import requests_staticmock
class_session = Session()
class TestMockClass(BaseMockClass):
def _api_v1_idea(self, method, params, headers):
if params['special'] == 'value':
return 'yes'
def _api_v1_brillo(self, url, body):
if json.loads(body)['special'] == 'value':
return 'yes'
a = ClassAdapter(TestMockClass)
session = requests.Session()
with requests_staticmock.mock_session_with_class(session, MyTestClass, 'http://test_context.com'):
response = new_session.request('get', 'http://test_context.com/api/v1/idea')
See StaticResponseFactory for simple ways of returning good and bad responses.
.. autoclass:: requests_staticmock.responses.StaticResponseFactory :members:
- Allow mocking of HTTP responses via a directory of static fixtures
- Support for sub-directories matching URL paths
This project takes inspiration and ideas from the requests_mock package, maintained by the OpenStack foundation. I redesigned this based on the abstractions within the requests project instead of using the patching pattern used in requests_mock. I find the responses more native, easier to work with and also the ability to load static files much easier.
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.