Skip to main content
 首页 » 编程设计

python之在同一测试中模拟对同一功能的两个单独响应

2025年05月04日15youxin

在我的previous问题,我问了如何在我的类中模拟一个包装 requests.get 的类。 answer如果我只调用一次 requests.get,则提供的效果很好。然而,事实证明我的类(class)比我举的例子更复杂。

我的类调用 request.get 两次。一次是在初始化时,因为它遇到了一个返回 API 值的 API 端点,我需要在我的实际请求中使用它,还有一次是在我进行 .fetch 调用时。

import requests 
class ExampleAPI(object): 
    def __init__(self): 
        self.important_tokens = requests.get(url_to_tokens)['tokens'] 
 
    def fetch(self, url, params=None, key=None, token=None, **kwargs): 
        return requests.get(url, params=self.important_tokens).json()  

现在,事实证明我需要创建两个模拟响应。一个用于初始化,一个用于 .fetch。使用上一个答案中的代码:

@patch('mymodule.requests.get') 
def test_fetch(self, fake_get): 
    expected = {"result": "True"} 
    fake_get.return_value.json.return_value = expected 
    e = ExampleAPI()    # This needs one set of mocked responses 
    self.assertEqual(e.fetch('http://my.api.url.example.com'), expected)    # This needs a second set 

如何为这两个单独的 request.get 调用创建单独的响应?

请您参考如下方法:

您可以将可迭代对象分配给模拟对象的 side_effects 属性;每次调用模拟时,它都会返回可迭代对象的下一项。

fake_responses = [Mock(), Mock()] 
fake_responses[0].json.return_value = ... 
fake_responses[1].json.return_value = ... 
fake_get.side_effects = fake_responses