我有三个函数正在尝试测试其调用顺序。
假设在模块 module.py 我有以下内容
# module.py
def a(*args):
# do the first thing
def b(*args):
# do a second thing
def c(*args):
# do a third thing
def main_routine():
a_args = ('a')
b_args = ('b')
c_args = ('c')
a(*a_args)
b(*b_args)
c(*c_args)
我想检查 b 在 a 之后和 c 之前是否被调用。因此,为 a、b 和 c 中的每一个进行模拟很容易:
# tests.py
@mock.patch('module.a')
@mock.patch('module.b')
@mock.patch('module.c')
def test_main_routine(c_mock, b_mock, a_mock):
# test all the things here
检查每个单独的模拟是否被调用也很容易。如何检查通话相对于彼此的顺序?
call_args_list
不起作用,因为它是为每个模拟单独维护的。
我尝试使用副作用来记录每个调用:
calls = []
def register_call(*args):
calls.append(mock.call(*args))
return mock.DEFAULT
a_mock.side_effect = register_call
b_mock.side_effect = register_call
c_mock.side_effect = register_call
但这只会给我调用模拟的参数,而不是调用所针对的实际模拟。我可以添加更多逻辑:
# tests.py
from functools import partial
def register_call(*args, **kwargs):
calls.append(kwargs.pop('caller', None), mock.call(*args, **kwargs))
return mock.DEFAULT
a_mock.side_effect = partial(register_call, caller='a')
b_mock.side_effect = partial(register_call, caller='b')
c_mock.side_effect = partial(register_call, caller='c')
这似乎可以完成工作......但是有更好的方法吗?感觉 API 中应该已经有一些我缺少的东西可以做到这一点。