我现在已经完全切换到unittest.mock
并拥有以下工作代码:
@mock.patch('.'.join([__name__, 'TestMock', 'f_3']))
@mock.patch('.'.join([__name__, 'TestMock', 'f_2']))
@mock.patch('.'.join([__name__, 'TestMock', 'f_1']))
def test_order_2(f_1: mock.NonCallableMock,
f_2: mock.NonCallableMock,
f_3: mock.NonCallableMock) -> None:
manager = mock.Mock()
manager.attach_mock(f_1, 'f_1')
manager.attach_mock(f_2, 'f_2')
manager.attach_mock(f_3, 'f_3')
obj = TestMock()
obj.run()
manager.assert_has_calls([mock.call.f_1,
mock.call.f_2,
mock.call.f_3], any_order=False)
问题来了:我不太了解属性名称背后的含义,所以它们是强制性的,但对我来说唯一合理的名称是函数名称本身......我修改了属性名称如下:
@mock.patch('.'.join([__name__, 'TestMock', 'f_3']))
@mock.patch('.'.join([__name__, 'TestMock', 'f_2']))
@mock.patch('.'.join([__name__, 'TestMock', 'f_1']))
def test_order_1(f_1: mock.NonCallableMock,
f_2: mock.NonCallableMock,
f_3: mock.NonCallableMock) -> None:
manager = mock.Mock()
manager.attach_mock(f_1, f_1._extract_mock_name())
manager.attach_mock(f_2, f_2._extract_mock_name())
manager.attach_mock(f_3, f_3._extract_mock_name())
obj = TestMock()
obj.run()
manager.assert_has_calls([mock.call.f_1,
mock.call.f_2,
mock.call.f_3], any_order=False)
很高兴听到你对此的看法!
顺便说一句,为什么f_*
模拟对象是这种mock.NonCallableMoc
类型的?我希望它们被虚拟函数(Collable
)取代......
再次感谢您的帮助!
最好的,阿列克谢