gpt4 book ai didi

python - 检查多个模拟的调用顺序

转载 作者:行者123 更新时间:2023-11-28 18:56:55 26 4
gpt4 key购买 nike

我尝试测试三个函数的调用顺序。

假设在模块 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

但这只给我调用模拟的 args,而不是调用所针对的实际模拟。我可以添加更多逻辑:

# 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 中应该已经有一些东西可以做到这一点,而我所缺少的。

最佳答案

定义一个 Mock 管理器并通过 attach_mock() 将模拟附加到它.然后检查 mock_calls:

@patch('module.a')
@patch('module.b')
@patch('module.c')
def test_main_routine(c, b, a):
manager = Mock()
manager.attach_mock(a, 'a')
manager.attach_mock(b, 'b')
manager.attach_mock(c, 'c')

module.main_routine()

expected_calls = [call.a('a'), call.b('b'), call.c('c')]
assert manager.mock_calls == expected_calls

只是为了测试它是否有效,更改 main_routine() 函数中函数调用的顺序,添加看看它是否抛出 AssertionError

查看更多示例 Tracking order of calls and less verbose call assertions (链接已失效;替代:https://docs.python.org/3/library/unittest.mock.html#attaching-mocks-as-attributes)

希望对您有所帮助。

关于python - 检查多个模拟的调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57248417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com