When a unittest.mock.Mock
对象已被调用,我可以使用调用的确切签名检查参数值:
from unittest.mock import Mock
m = Mock() # creation of mock
m('foo', bar='baz') # call to the mock
m.assert_called_once_with('foo', bar='baz') # check call arguments
检查具有相同值的不同签名将会失败。例如,如果我们检查'baz'
作为位置参数而不是命名参数,断言将失败:
m.assert_called_once_with('foo', 'baz')
# AssertionError: Expected call: mock('foo', 'baz')
# Actual call: mock('foo', bar='baz')
必须如此。如果函数替换为m
was
def actual_fu(foo, bar):
# do something
那么调用将是等效的,但如果是
def a_different_actual_fu(foo, *args, bar='some default'):
# do something
那么这些调用就不会是等价的。Mock
不知道实际函数的签名,因此它不能依赖于我们在第一种情况下的等价性。
有没有一种方法可以检查调用参数值不知道它们是按位置传递还是作为关键字参数传递,通过让模拟(或断言辅助函数或类似函数)知道被模拟替换的实际函数?
The Mock
可以使用可选的对象来了解它所替换的对象(可以是函数或方法)spec争论 https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock或与自动指定 https://docs.python.org/3/library/unittest.mock.html#auto-speccing,但它们有不同的目的(限制模拟中允许的调用)并且不影响事后检查。