Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在类中模拟使用requests.get的方法?_Python_Python 2.7_Mocking_Python Unittest - Fatal编程技术网

Python 如何在类中模拟使用requests.get的方法?

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() #

我正在尝试为我的类创建一些单元测试。我想模拟这些,这样我就不会在运行这些测试时耗尽API配额。我有多个测试用例将调用
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
库。