如何断言模拟对象未受影响?例如断言没有访问任何属性,没有调用任何方法,没有读取或修改任何属性?
简单的答案是“用户是常规 Mock 而不是 MagicMock”吗?如果是这样,如何将其与
unittest.mock.patch
结合起来?
是的,简单的
mock.Mock
对象不会提供对任意属性的访问(与 MagicMock
不同)。
只需告诉
patch
使用它即可:
mock.patch('target', new=mock.Mock)
为了获得更精细的可见性,您仍然可以使用 MagicMock,但在运行测试代码之前和之后检查其属性。
例如
@mock.patch('target')
def test_something(self, mocked_target):
core_attrs = set(dir(mocked_target))
# Call the tested function here
some_tested_code(...)
final_attrs = set(dir(mocked_target))
new_attrs = final_attrs - core_attrs
# This will fail and print all unexpectedly accessed attributes on the mocked target
self.assertEqual(new_attrs, set())