考虑以下情况:
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',
},
)
我如何Assert我正在修补的get
被'/endpoint'
和headers
调用?当我现在运行测试时,我得到以下失败消息:FAILED test/utility/test_api_session.py::test_api_session_get - AttributeError: 'MonkeyPatch' object has no attribute 'assert_called_with'
我做错了什么?感谢所有提前回复的人。
2条答案
按热度按时间dzjeubhm1#
将添加另一个使用monkeyatch而不是“你不能使用monkeyatch”的响应
由于python有闭包,下面是我的穷人用moncluatch做这些事情的方法:
在你的例子中,因为我们正在做类似的事情来修补HTTP服务器的方法处理程序,你可以做类似的事情(不是说这很漂亮):
gopyfrb32#
您需要一个
Mock
对象来调用assert_called_with
-monkeypatch
不提供开箱即用的功能。您可以使用unittest.mock.patch
和side_effect
来实现这一点:仍然需要使用
side_effect
来获取mock对象(在本例中为mocked
,类型为MagickMock
),而不是仅在patch
中设置自己的对象,否则将无法使用assert_called_...
方法。assert_called...
方法的使用有关。这并不意味着你不能使用monthlatch来实现类似的功能,正如Tommy的回答中所展示的那样。