如何模拟在我的课程中使用requests.get的方法?

时间:2016-03-01 20:10:40

标签: python python-2.7 mocking python-unittest

我试图为我的班级创建一些单元测试。我想嘲笑这些,这样我就不会通过运行其中一些测试的API配额进行刻录。我有多个测试用例会调用fetch方法,并且根据传递的网址,我会得到不同的结果。

我的示例类如下所示:

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

tutorial我正在查看表明我可以做这样的事情:

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)

在我班级的方法中模拟requests.get调用的正确方法是什么?我需要能够更改每个测试的模拟响应,因为不同的URL可以提供不同的响应类型。

2 个答案:

答案 0 :(得分:3)

您的虚假提取需要接受与原始提取相同的参数:

def fake_fetch(self, url, params=None, key=None, token=None, **kwargs):

请注意,最好只模拟外部界面,这意味着让fetch调用requests.get(或至少,它认为是requests.get):

@patch('mymodule.requests.get')
def test_fetch(self, fake_get):
    # It would probably be better to just construct
    # a valid fake response object whose `json` method
    # would return the right thing, but this is a easier
    # for demonstration purposes. I'm assuming nothing else
    # is done with the response.
    expected = {"result": "True"}
    fake_get.return_value.json.return_value = expected
    e = ExampleAPI()
    self.assertEqual(e.fetch('http://my.api.url.example.com'), expected)

答案 1 :(得分:0)

从你的测试方法

你可以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()方法中设置补丁