我使用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()
返回我们指定的字典