我正在编写一个编排两个乐器的课程(一个可远程控制的电源单元和一个用于控制被测设备的总线控制器),以便在一个Device-Under-上执行各种测量。测试(DUT)。
对两个工具的访问都是作为Python类实现的,并且对每个工具的引用都可用于新类。 DUT有些微妙,并且具有非常特定的上电顺序,包括对电源和总线控制器的调用,并且必须按特定顺序发生,以避免损坏DUT。
现在我想为这个课写一个单元测试。我目前正在使用nosetests和mock-package。所以我的想法是模拟两个乐器类并验证那些正确的调用顺序。
验证每个模拟类本身的调用顺序似乎非常容易。因此,我能够找出电源是否被命令首先正确地施加电池电压,然后是数字域电压然后是模拟域电压。我还可以发现数字寄存器已被编程为正确的值。但是,我确定在应用数字域电压和模拟域电压之间是否发生了写入数字寄存器的调用。
所以我的问题是:如果我有两个模拟对象,我如何验证这些对象之间的特定调用顺序?我的第一个问题是查看电话的时间戳,但那些似乎不存在。
答案 0 :(得分: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()]
好的,现在我们处于有利位置:我们只需检查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()]
因为我们想要第一遍和逆序失败。
当您使用patch
时,只需获取修补程序返回的模拟并将它们放入新的Mock()
容器中。检查记录子呼叫顺序的容器。