一个实用程序,用于模拟出的Python请求库:Responses
jopen
10年前
一个实用程序,用于模拟出的Python请求库:Responses。
Response body as string
import responses import requests @responses.activate def test_my_api(): responses.add(responses.GET, 'http://推ter.com/api/1/foobar', body='{"error": "not found"}', status=404, content_type='application/json') resp = requests.get('http://推ter.com/api/1/foobar') assert resp.json() == {"error": "not found"} assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'http://推ter.com/api/1/foobar' assert responses.calls[0].response.text == '{"error": "not found"}'
Request callback
import json import responses import requests @responses.activate def test_calc_api(): def request_callback(request): payload = json.loads(request.body) resp_body = {'value': sum(payload['numbers'])} headers = {'request-id': '728d329e-0e86-11e4-a748-0c84dc037c13'} return (200, headers, json.dumps(resp_body)) responses.add_callback( responses.GET, 'http://calc.com/sum', callback=request_callback, content_type='application/json', ) resp = requests.post( 'http://calc.com/sum', json.dumps({'numbers': [1, 2, 3]}), headers={'content-type': 'application/json'}, ) assert resp.json() == {'value': 6} assert len(responses.calls) == 1 assert responses.calls[0].request.url == 'http://calc.com/sum' assert responses.calls[0].response.text == '{"value": 6}' assert ( responses.calls[0].response.headers['request-id'] == '728d329e-0e86-11e4-a748-0c84dc037c13' )
Instead of passing a string URL into responses.add or responses.add_callback you can also supply a compiled regular expression.
import re import responses import requests # Instead of responses.add(responses.GET, 'http://推ter.com/api/1/foobar', body='{"error": "not found"}', status=404, content_type='application/json') # You can do the following url_re = re.compile(r'https?://推ter.com/api/\d+/foobar') responses.add(responses.GET, url_re, body='{"error": "not found"}', status=404, content_type='application/json')
A response can also throw an exception as follows.
import responses import requests from requests.exceptions import HTTPError exception = HTTPError('Something went wrong') responses.add(responses.GET, 'http://推ter.com/api/1/foobar', body=exception) # All calls to 'http://推ter.com/api/1/foobar' will throw exception.