一个实用程序,用于模拟出的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.

项目主页:http://www.open-open.com/lib/view/home/1416984984237