Mock requests.post



我使用pytest来测试调用requests.post的方法。有没有一种简单的方法,最好没有第三方库来做到这一点?

class Dispatcher:
def __init__(self, url):
self.url = url
self.session = None
def dispatch(self):
return self.session.post(self.url).json()

def test_dispatch():
d = Dispatcher(url="")
d.session = # ... here, how can I mock the return value of json()?
result = d.dispatch()

这是一个非常简单的例子。我们想将session设置为MagicMock对象。

from unittest.mock import MagicMock
def test_dispatch():
expected = {"fizz": "buzz"}
mock_session = MagicMock()
mock_session.configure_mock(
**{
"post.return_value": mock_session,
"json.return_value": expected
}
)
d = Dispatcher(url="")
d.session = mock_session
result = d.dispatch()
assert result == expected

由于Mock对象在调用方法时(没有配置)返回一个全新的模拟对象,因此我们必须这样配置对象。如果我们没有将post配置为返回我们拥有的原始模拟,那么它将返回一个全新的模拟对象,我们的测试将失败。相反,您可以配置另一个Mock对象作为post的返回值并配置该对象,但我更喜欢这种方法。

显示呼叫的解释如下。

self.session是我们创建的mock_session对象

self.session.post(arg, **kwargs)返回mock_session

mock_session.json()返回我们指定的字典

最新更新