python unittest.mock 断言没有访问属性属性方法

问题描述 投票:0回答:1

如何断言模拟对象未受影响?例如断言没有访问任何属性,没有调用任何方法,没有读取或修改任何属性?

简单的答案是“用户是常规 Mock 而不是 MagicMock”吗?如果是这样,如何将其与

unittest.mock.patch
结合起来?

python mocking python-unittest
1个回答
0
投票

是的,简单的

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())
© www.soinside.com 2019 - 2024. All rights reserved.