【发布时间】:2021-06-21 14:10:04
【问题描述】:
我有一个调用许多其他第 3 方方法的复杂函数。我将它们一一修补:
import ThirdParty as tp
def my_method():
tp.func_3rd_party_1()
...
tp.func_3rd_party_5()
return "some_value"
在我的测试中:
import pytest
def test_my_method(monkeypatch):
monkeypatch.setattr(ThirdParty, 'func_3rd_party_1', some_mock_1())
...
monkeypatch.setattr(ThirdParty, 'func_3rd_party_5', some_mock_5())
return_value = my_method()
assert return value
这运行得很好,但是这种形式的测试对我来说太隐晦了。我想明确声明确实调用了monkeypatched方法。
为了记录,我的模拟方法没有使用任何内置的模拟库资源。它们只是重新定义的方法(智能存根)。
有什么方法可以断言吗?
【问题讨论】:
-
您不能直接询问模拟对象是否以您希望的方式调用它们吗?
-
some_mock_1.assert_called_once()或assert_called的任何变体。 -
@Lagerbaer 感谢您的回复!就这么简单吗?作为记录,我没有使用任何
Mock对象,所以它们只是我纯粹重新定义的函数。 -
哦,如果您使用自己的函数,那么
assert_called()等将不起作用;您必须从例如获取Mock或MagicMockunittest.mock. -
@Lagerbaer 我想知道monkeypatching是否可以紧凑地实现,或者这意味着我应该从monkeypatch切换到
mock.patch。
标签: python pytest monkeypatching