这是您可以执行的方式(您可以直接运行此文件):
import requests
import unittest
from unittest import mock
class MyGreatClass:
def fetch_json(self, url):
response = requests.get(url)
return response.json()
def mocked_requests_get(*args, **kwargs):
class MockResponse:
def __init__(self, json_data, status_code):
self.json_data = json_data
self.status_code = status_code
def json(self):
return self.json_data
if args[0] == 'http://someurl.com/test.json':
return MockResponse({"key1": "value1"}, 200)
elif args[0] == 'http://someotherurl.com/anothertest.json':
return MockResponse({"key2": "value2"}, 200)
return MockResponse(None, 404)
class MyGreatClassTestCase(unittest.TestCase):
@mock.patch('requests.get', side_effect=mocked_requests_get)
def test_fetch(self, mock_get):
mgc = MyGreatClass()
json_data = mgc.fetch_json('http://someurl.com/test.json')
self.assertEqual(json_data, {"key1": "value1"})
json_data = mgc.fetch_json('http://someotherurl.com/anothertest.json')
self.assertEqual(json_data, {"key2": "value2"})
json_data = mgc.fetch_json('http://nonexistenturl.com/cantfindme.json')
self.assertIsNone(json_data)
self.assertIn(mock.call('http://someurl.com/test.json'), mock_get.call_args_list)
self.assertIn(mock.call('http://someotherurl.com/anothertest.json'), mock_get.call_args_list)
self.assertEqual(len(mock_get.call_args_list), 3)
if __name__ == '__main__':
unittest.main()
重要提示: 如果您的MyGreatClass
类位于另一个包中,比如说my.great.package
,那么你需要模拟my.great.package.requests.get
而不是仅仅使用'request.get'。在这种情况下,您的测试用例应该如下所示:
import unittest
from unittest import mock
from my.great.package import MyGreatClass
def mocked_requests_get(*args, **kwargs):
class MyGreatClassTestCase(unittest.TestCase):
@mock.patch('my.great.package.requests.get', side_effect=mocked_requests_get)
def test_fetch(self, mock_get):
if __name__ == '__main__':
unittest.main()
享受!