【发布时间】:2019-01-08 20:57:58
【问题描述】:
根据mock guide:
自动指定创建的模拟对象与被替换的对象具有相同的属性和方法,并且任何函数和方法(包括构造函数)都具有与真实对象相同的调用签名。
但这似乎不是真的。 Stdlib inspect 仍然在 mock 上看到一个通用的 *args, **kwargs 签名:
>>> from unittest.mock import patch
>>> def foo(arg1, arg2, arg3):
... pass
...
>>> print(*inspect.signature(foo).parameters)
arg1 arg2 arg3
>>> with patch("__main__.foo", autospec=True) as mock:
... print(*inspect.signature(mock).parameters)
...
args kwargs
自动规范起作用,因为mock(1,2,3,4) 将正确地引发TypeError: too many positional arguments,但似乎这是通过调用堆栈中更深的一些代码实现的。这不是通过调用签名完成的。
在您实际依赖签名本身的代码中(并且在测试中模拟时需要保留正确的签名),如何以正确保留签名的方式自动指定模拟?
【问题讨论】:
-
mock.assert_called_with是手动执行此检查的方式吗? (即不是自动指定,而是检查签名)
标签: python unit-testing mocking inspect