python - 模拟请求.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()
返回我们指定的字典
推荐阅读
- python-3.x - 在 Python 中为 txt 文件添加索引列
- swiftui - SwiftUI: How to constrain image size?
- java - Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 setTokenProvider(Lcom/google/firebase/internal/InternalTokenProvider;)V
- nim-lang - 为什么显式指定泛型类型的 proc 不起作用?
- r - 由于 dplyr 函数参数中的非标准表达式,R 包失败 R CMD 检查
- reactjs - 世博包APK/IPA包过大
- python - (VS Code)Pylint 在导入模块时抛出语法错误,但在我运行代码时工作得很好
- c# - Task.Run 是否能够在后台运行冗长的代码?
- pandas - 合并数据帧时的 KeyError(key)
- heroku - Heroku 无法使用 gamedig 节点模块