Last active
December 28, 2024 15:07
-
Star
(106)
You must be signed in to star a gist -
Fork
(15)
You must be signed in to fork a gist
-
-
Save evansde77/45467f5a7af84d2a2d34f3fcb357449c to your computer and use it in GitHub Desktop.
Example of mocking requests calls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
mocking requests calls | |
""" | |
import mock | |
import unittest | |
import requests | |
from requests.exceptions import HTTPError | |
def google_query(query): | |
""" | |
trivial function that does a GET request | |
against google, checks the status of the | |
result and returns the raw content | |
""" | |
url = "https://www.google.com" | |
params = {'q': query} | |
resp = requests.get(url, params=params) | |
resp.raise_for_status() | |
return resp.content | |
class TestRequestsCall(unittest.TestCase): | |
""" | |
example text that mocks requests.get and | |
returns a mock Response object | |
""" | |
def _mock_response( | |
self, | |
status=200, | |
content="CONTENT", | |
json_data=None, | |
raise_for_status=None): | |
""" | |
since we typically test a bunch of different | |
requests calls for a service, we are going to do | |
a lot of mock responses, so its usually a good idea | |
to have a helper function that builds these things | |
""" | |
mock_resp = mock.Mock() | |
# mock raise_for_status call w/optional error | |
mock_resp.raise_for_status = mock.Mock() | |
if raise_for_status: | |
mock_resp.raise_for_status.side_effect = raise_for_status | |
# set status code and content | |
mock_resp.status_code = status | |
mock_resp.content = content | |
# add json data if provided | |
if json_data: | |
mock_resp.json = mock.Mock( | |
return_value=json_data | |
) | |
return mock_resp | |
@mock.patch('requests.get') | |
def test_google_query(self, mock_get): | |
"""test google query method""" | |
mock_resp = self._mock_response(content="ELEPHANTS") | |
mock_get.return_value = mock_resp | |
result = google_query('elephants') | |
self.assertEqual(result, 'ELEPHANTS') | |
self.assertTrue(mock_resp.raise_for_status.called) | |
@mock.patch('requests.get') | |
def test_failed_query(self, mock_get): | |
"""test case where google is down""" | |
mock_resp = self._mock_response(status=500, raise_for_status=HTTPError("google is down")) | |
mock_get.return_value = mock_resp | |
self.assertRaises(HTTPError, google_query, 'elephants') | |
if __name__ == '__main__': | |
unittest.main() |
Thank you
Thank you!!
Thank you!
it helped me a LOT, thanks so much.
Thank you
Hey @evansde77 : Really nice snippet to get the knowledge of mocking requests API calls with raise_for_status
scenario.
I would just recommend one thing here, instead of mocking actual request.get
library, we should add patch at mock_requests.request.get
. In this way, we are truly mocking actual object.
Let me know your thoughts on this!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you so much for this example.