2

在使用模拟库时,我遇到了调用my_mock.reset_mock()方法返回一个新Mock实例而不是重置my_mock. 显然我以某种方式掩盖Mock.reset_mock()了,但我无法弄清楚这是怎么发生的。

示例运行(Python 2.7):

>>> mocks.normal_mock.mock_calls
Out[6]: []
>>> mocks.normal_mock.reset_mock()
>>> mocks.normal_mock.mock_calls
Out[8]: []
>>> mocks.abnormal_mock.mock_calls
Out[2]: []
>>> mocks.abnormal_mock.reset_mock()
>>> <MagicMock name='abnormal_mock.reset_mock()' id='157604104'>
>>> mocks.abnormal_mock.mock_calls
Out[4]: [call.reset_mock()]

知道是什么原因造成的吗?

附加信息:

  • 所有的模拟都封装在一个指定的类中,该类被实例化一次,并在unittest.TestCase.tearDown().
  • 所有模拟都是调用patch.start()一些修补的对象/方法/模块创建的
  • 在我的示例中,正常和异常模拟都模拟了由 UUT 导入的模块(每个模块不同)
4

1 回答 1

4

发现问题。

由于某种复杂的模拟创建方式,我调用patch()了一个已经修补的模块,即我正在修补一个Mock()对象。因为autospecTrue为了补丁调用,所以打了mock_reset()补丁。

解决方案是简化模拟创建流程。

于 2013-08-20T08:24:10.513 回答