Search code examples
pythonpython-responses

How to raise an error if a url was accessed but not registered in python-responses?


By default, Responses will raise an assertion error if a url was registered but not accessed. How can one do the opposite i.e. raise an error if a url was accessed but not registered?


Solution

  • If you request a URL that was not registered, you will get a

    requests.exceptions.ConnectionError
    

    Example

    import responses
    import requests
    
    @responses.activate
    def test_my_api():
        resp = requests.get('https://twitter.com/')
        print resp
    
    def run_my_api():
        resp = requests.get('https://twitter.com/')
        print resp
    
    if __name__ == '__main__':
        print "Without responses..."
        run_my_api()
        print ""
        print "With responses..."
        test_my_api()
    

    Output

    Without responses...
    <Response [200]>
    
    With responses...
    Traceback (most recent call last):
      File "example.py", line 18, in <module>
        test_my_api()
      File "<string>", line 3, in wrapper
      File "example.py", line 6, in test_my_api
        resp = requests.get('https://twitter.com/')
      File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 70, in get
        return request('get', url, params=params, **kwargs)
      File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request
        return session.request(method=method, url=url, **kwargs)
      File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
        r = adapter.send(request, **kwargs)
      File "/usr/local/lib/python2.7/site-packages/responses.py", line 294, in unbound_on_send
        return self._on_request(adapter, request, *a, **kwargs)
      File "/usr/local/lib/python2.7/site-packages/responses.py", line 239, in _on_request
        raise response
    requests.exceptions.ConnectionError: Connection refused: GET https://twitter.com/
    

    The <Response [200]> is from the undecorated run_my_api call. You can use assertRaises or the equivalent to check for the exception.