python-3.x - 如何断言在 pytest 中调用了猴子补丁?
问题描述
考虑以下:
class MockResponse:
status_code = 200
@staticmethod
def json():
return {'key': 'value'}
# where api_session is a fixture
def test_api_session_get(monkeypatch, api_session) -> None:
def mock_get(*args, **kwargs):
return MockResponse()
monkeypatch.setattr(requests.Session, 'get', mock_get)
response = api_session.get('endpoint/') # My wrapper around requests.Session
assert response.status_code == 200
assert response.json() == {'key': 'value'}
monkeypatch.assert_called_with(
'endpoint/',
headers={
'user-agent': 'blah',
},
)
我如何断言get
我正在修补的被调用'/endpoint'
and headers
?当我现在运行测试时,我收到以下失败消息:
FAILED test/utility/test_api_session.py::test_api_session_get - AttributeError: 'MonkeyPatch' object has no attribute 'assert_called_with'
我在这里做错了什么?感谢所有提前回复的人。
解决方案
将添加另一个使用monkeypatch 而不是“你不能使用monkeypatch”的响应
由于python有闭包,这是我可怜的人用monkeypatch做这些事情的方式:
patch_called = False
def _fake_delete(keyname):
nonlocal patch_called
patch_called = True
assert ...
monkeypatch.setattr("mymodule._delete", _fake_delete)
res = client.delete(f"/.../{delmeid}"). # this is a flask client
assert res.status_code == 200
assert patch_called
在您的情况下,由于我们正在通过修补 HTTP 服务器方法处理程序来做类似的事情,您可以做类似的事情(不是说这很漂亮):
param_called = None
def _fake_delete(param):
nonlocal param_called
patch_called = param
assert ...
monkeypatch.setattr("mymodule._delete", _fake_delete)
res = client.delete(f"/.../{delmeid}")
assert res.status_code == 200
assert param_called == "whatever this should be"
推荐阅读
- javascript - 如何从ajax的databtable按钮传递学生ID以打开另一个页面并通过邮寄方式获取
- powershell - 框架不同部分的自动化
- mysql - 限制用户的服务器资源时出错
- mongodb - MongoDB Compass 使用 ssl 立即断开连接,但从命令行可以正常工作
- php - 我正在使用 zklib 库生物识别设备来获取学生的出勤记录,但它向我显示空白页
- git - Azure DevOps 中新创建的 git 分支未显示在 Visual Studio 2017 中
- python - “资源耗尽:分配张量时的 OOM”在 GPT 2 模型的重新训练期间:
- python - 如何从键列表和列表值快速构建 python 字典?
- python - 在 Python 3.6+ 中,将浮点 9.9 打印为字符串 09.90 和将 10 打印为 10.00 的 f 字符串是什么?
- php - 搜索中的 Laratable 模棱两可的列