Python 如何在类中模拟使用requests.get的方法?
我正在尝试为我的类创建一些单元测试。我想模拟这些,这样我就不会在运行这些测试时耗尽API配额。我有多个测试用例将调用Python 如何在类中模拟使用requests.get的方法?,python,python-2.7,mocking,python-unittest,Python,Python 2.7,Mocking,Python Unittest,我正在尝试为我的类创建一些单元测试。我想模拟这些,这样我就不会在运行这些测试时耗尽API配额。我有多个测试用例将调用fetch方法,根据传递的URL,我将返回不同的结果 我的示例类如下所示: import requests class ExampleAPI(object): def fetch(self, url, params=None, key=None, token=None, **kwargs): return requests.get(url).json() #
fetch
方法,根据传递的URL,我将返回不同的结果
我的示例类如下所示:
import requests
class ExampleAPI(object):
def fetch(self, url, params=None, key=None, token=None, **kwargs):
return requests.get(url).json() # Returns a JSON string
import unittest
from mock import patch
def fake_fetch_test_one(url):
...
class TestExampleAPI(unittest.TestCase):
@patch('mymodule.ExampleAPI.fetch', fake_fetch_test_one)
def test_fetch(self):
e = ExampleAPI()
self.assertEqual(e.fetch('http://my.api.url.example.com'), """{'result': 'True'}""")
我正在看的节目表明我可以做这样的事情:
import requests
class ExampleAPI(object):
def fetch(self, url, params=None, key=None, token=None, **kwargs):
return requests.get(url).json() # Returns a JSON string
import unittest
from mock import patch
def fake_fetch_test_one(url):
...
class TestExampleAPI(unittest.TestCase):
@patch('mymodule.ExampleAPI.fetch', fake_fetch_test_one)
def test_fetch(self):
e = ExampleAPI()
self.assertEqual(e.fetch('http://my.api.url.example.com'), """{'result': 'True'}""")
但是,当我这样做时,我会得到一个错误,上面写着:
TypeError: fake_fetch_test_one() takes exactly 1 argument (3 given)
模拟类中方法中的
请求.get
调用的正确方法是什么?我需要能够更改每个测试的模拟响应,因为不同的URL可以提供不同的响应类型。通过您的测试方法,您可以monkeypatch您的请求模块
import unittest
class Mock:
pass
ExampleAPI.requests = Mock()
def fake_get_test_one(url):
/*returns fake get json */
ExampleAPI.requests.get= Mock()
ExampleAPI.requests.json = fake_get_test_one
class TestExampleAPI(unittest.TestCase):
def test_fetch(self):
e = ExampleAPI()
self.assertEqual(e.fetch('http://my.api.url.example.com'), """{'result': 'True'}""")
如果需要,您可以在测试类的每个setup()和相应的teardown()方法中设置修补程序
import unittest
class Mock:
pass
ExampleAPI.requests = Mock()
def fake_get_test_one(url):
/*returns fake get json */
ExampleAPI.requests.get= Mock()
ExampleAPI.requests.json = fake_get_test_one
class TestExampleAPI(unittest.TestCase):
def test_fetch(self):
e = ExampleAPI()
self.assertEqual(e.fetch('http://my.api.url.example.com'), """{'result': 'True'}""")
如果需要,您可以在测试类的每个setup()和相应的teardown()方法中设置修补程序您的伪获取需要接受与原始获取相同的参数:
def fake_fetch(self, url, params=None, key=None, token=None, **kwargs):
请注意,最好只模拟外部接口,这意味着让获取
调用请求。获取
(或者至少,它认为是请求。获取
):
您的伪获取需要接受与原始获取相同的参数:
def fake_fetch(self, url, params=None, key=None, token=None, **kwargs):
请注意,最好只模拟外部接口,这意味着让获取
调用请求。获取
(或者至少,它认为是请求。获取
):
不需要发明你自己的模仿系统;OP使用的是
mock
库。无需发明自己的模拟系统;OP正在使用mock
库。