从unittest.mock.create_autospec()
获得的模拟似乎没有对某些函数执行参数检查。例如,请考虑以下代码(我使用CPython 3.4.0
):
import os
from unittest.mock import create_autospec
def os_chdir(dir): # The same signature as os.chdir().
pass
m1 = create_autospec(os_chdir)
m1('first', 'second') # Raises TypeError: too many positional arguments.
m2 = create_autospec(os.chdir)
m2('first', 'second') # Passes without an exception...
为什么m1
正确检查参数计数但m2
没有?对于在交互式会话中打印时将自己标识为built-in function
的其他功能,情况也是如此。 documentation似乎没有提到这种情况。
答案 0 :(得分:0)
根据我的发现,答案可能在于以下几点:
import inspect
print(inspect.getfullargspec(os_chdir))
# Prints FullArgSpec(args=['dir'], varargs=None, varkw=None, defaults=None,
# kwonlyargs=[], kwonlydefaults=None, annotations={})
print(inspect.getfullargspec(os.chdir))
# Raises ValueError: no signature found for builtin <built-in function chdir>
也就是说,unittest.mock.create_autospec()
无法找到此类内置函数的签名。