我使用的是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)我已经通读了文档,但没有找到对它们的解释。也许它们是测试术语?如果有人能提供信息那就太好了,谢谢。
发布于 2014-08-15 16:37:13
Python3.x中的unittest.mock与mock基本相同。
根据unittest.mock文档:
模拟规范:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例)。如果传入一个对象,则通过在对象上调用dir来形成一个字符串列表(不包括不受支持的魔术属性和方法)。访问任何不在此列表中的属性将引发AttributeError。
如果spec是一个对象(而不是字符串列表),则_class_将返回spec对象的类。这允许mock通过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.c # get -> success (although c is not in the spec)
9
>>> 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'发布于 2014-08-15 16:42:23
你可以在这里找到更多信息:http://www.voidspace.org.uk/downloads/mock-1.0.1.pdf
·spec:这可以是字符串列表,也可以是充当模拟对象规范的现有对象(类或实例)。如果传入一个对象,则通过在对象上调用dir来形成一个字符串列表(不包括不受支持的魔术属性和方法)。访问任何不在此列表中的属性将引发AttributeError。如果spec是一个对象(而不是字符串列表),则类将返回spec对象的类。这允许mock通过isinstance测试。
·spec_set:更严格的规范变体。如果使用,尝试在模拟上设置或获取不在作为spec_set传递的对象上的属性将引发AttributeError。
https://stackoverflow.com/questions/25323361
复制相似问题