我正在使用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)
我已经阅读了文档,但没有找到解释。也许他们是测试的条款?如果有人能提供信息会很好,谢谢。
答案 0 :(得分:13)
unittest.mock
与mock
基本相同。
根据unittest.mock
文档:
spec :这可以是字符串列表或现有对象(a 作为模拟对象的规范的类或实例)。 如果传入一个对象,则通过调用形成一个字符串列表 对象上的目录(不包括不受支持的魔法属性和 方法)。访问不在此列表中的任何属性将引发 AttributeError的。
如果spec是一个对象(而不是一个字符串列表)那么__class__ 返回spec对象的类。这允许嘲笑通过 实例测试。
spec_set :更严格的规范变体。如果使用,尝试设置或 获取一个不在传递的对象上的mock的属性 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'
答案 1 :(得分:0)
您可以在此处找到更多信息:http://www.voidspace.org.uk/downloads/mock-1.0.1.pdf
•spec:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例)。如果传入一个对象,则通过在对象上调用dir来形成字符串列表(不包括不受支持的魔术属性和方法)。访问不在此列表中的任何属性将引发AttributeError。如果spec是一个对象(而不是一个字符串列表),那么 class 将返回spec对象的类。这允许模拟通过isinstance测试。
•spec_set:更严格的规范变体。如果使用,尝试在模拟上设置或获取不在作为spec_set传递的对象上的属性将引发AttributeError。