在我的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
关于python - 在同一测试中模拟对同一功能的两个单独响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737788/