Python单元测试有两个模拟对象,如何验证调用顺序?

jan*_*jan 10 python unit-testing mocking

我正在编写一个编排两个仪器(一个可远程控制的电源单元和一个用于控制被测器件的总线控制器)的课程,以便在被测器件(DUT)上执行各种测量.

对两个工具的访问都是作为Python类实现的,并且对每个工具的引用都可用于新类.DUT有些微妙,并且具有非常特定的上电序列,涉及对电源和总线控制器的调用,并且必须以特定顺序发生以避免损坏DUT.

现在我想为这个类写一个单元测试.我目前正在使用nosetests和mock-package.所以我的想法是模拟两个乐器类并验证那些正确的调用顺序.

验证每个模拟类本身的调用顺序似乎很容易.因此,我能够找出电源是否被命令首先正确地施加电池电压,然后是数字域电压然后是模拟域电压.我还可以发现数字寄存器已被编程为正确的值.但是,我很难确定在应用数字域电压和模拟域电压之间是否发生了写入数字寄存器的调用.

所以我的问题是:如果我有两个模拟对象,我如何验证这些对象之间的特定调用顺序?我的第一个问题是检查呼叫的时间戳,但那些似乎不存在.

Mic*_*ico 12

你可以做的是将你Mock()的模拟放在一个新的对象中,并检查模拟的新模拟调用.也许一个例子更容易理解:

>>> from unittest.mock import *
>>> m0, m1 = Mock(), Mock()
>>> m = Mock()
>>> m.m0, m.m1 = m0, m1
>>> m0()
<Mock name='mock.m0()' id='140660445334224'>
>>> m1()
<Mock name='mock.m1()' id='140660445334608'>
>>> m.mock_calls
[call.m0(), call.m1()]
Run Code Online (Sandbox Code Playgroud)

好了,现在我们处于有利位置:我们可以检查m验证订单是否正确:

>>> m.assert_has_calls([call.m0(), call.m1()])
>>> m.assert_has_calls([call.m1(), call.m0()])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls
    'Actual: %r' % (calls, self.mock_calls)
AssertionError: Calls not found.
Expected: [call.m1(), call.m0()]
Actual: [call.m0(), call.m1()]
Run Code Online (Sandbox Code Playgroud)

因为我们想要第一遍和逆序失败.

当您使用时,patch只需取出补丁返回的模拟并将它们放入一个新Mock()的容器中.检查记录子呼叫顺序的容器.

  • 仅供参考,这对我不起作用。我一直收到一个空的通话清单。我必须使用 `attach_mock` 来正确跟踪呼叫,请参阅此答案:/sf/answers/1587421671/ (2认同)