【发布时间】:2016-04-28 23:09:18
【问题描述】:
当 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替换的函数是
def actual_fu(foo, bar):
# do something
那么调用将是等价的,但如果是的话
def a_different_actual_fu(foo, *args, bar='some default'):
# do something
那么调用将不相等。 Mock 不知道实际函数的签名,所以它不能依赖我们在第一种情况下的等价性。
有没有一种方法可以通过让 Mock(或断言辅助函数或类似函数)知道实际函数被 mock 替换了吗?
Mock 对象可以使用可选的spec argument 或autospeccing 来识别它所替换的对象(可以是函数或方法),但它们用于不同的目的(限制允许的调用在模拟上)并且不影响事后检查。
【问题讨论】:
-
AFAIK 在模拟 1.3 中是不可能的。但是......恕我直言,尝试理解呼叫语义不是模拟职责,而只是记录您如何进行呼叫。
assert_called_once_with(...)只是方法所说的,而不是assert_called_with_something_that_is_equivalent_to(...):听起来更像是存根的职责。无论如何,在某些情况下可能会非常有用....几天前我遇到了与此相关的事情stackoverflow.com/a/34811786/4101725
标签: python unit-testing mocking python-unittest.mock