我正在使用Mock 1.0.1 python.在路径函数定义中有两个可选参数名称spec和spec_set(也是auto_spec)
patch(target, new=DEFAULT, spec=None, create=False, spec_set=None, autospec=None, new_callable=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了文档,但没有找到它们的解释.也许他们是测试的条款?如果有人能提供信息会很好,谢谢.
fal*_*tru 15
unittest.mock
在Python 3.x中基本相同mock
.
根据unittest.mock
文件:
spec:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例).如果传入一个对象,则通过在对象上调用dir来形成字符串列表(不包括不受支持的魔术属性和方法).访问不在此列表中的任何属性将引发AttributeError.
如果spec是一个对象(而不是一个字符串列表),那么__class__将返回spec对象的类.这允许模拟通过isinstance测试.
spec_set:更严格的规范变体.如果使用,尝试在模拟上设置或获取不在作为spec_set传递的对象上的属性将引发AttributeError.
更新spec
和之间的差异spec_set
.
使用spec
,您可以设置未指定的属性,而使用时spec_set
,不允许设置未指定的属性.
例:
>>> from unittest.mock import Mock
>>> class A:
... def __init__(self, a, b):
... self.a = a
... self.b = b
...
>>> aobj = A(1, 2)
>>> m = Mock(spec=aobj) # spec
>>> m.c # get -> fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.6.0b4_3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 582, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'c'
>>> m.c = 9 # set -> success
>>>
>>> m = Mock(spec_set=aobj) # spec_set
>>> m.a
<Mock name='mock.a' id='4544967400'>
>>> m.b
<Mock name='mock.b' id='4545493928'>
>>> m.c # get -> fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.6.0b4_3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 582, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'c'
>>> m.c = 9 # set -> fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.6.0b4_3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/mock.py", line 688, in __setattr__
raise AttributeError("Mock object has no attribute '%s'" % name)
AttributeError: Mock object has no attribute 'c'
Run Code Online (Sandbox Code Playgroud)