什么是spec和spec_set

时间:2014-08-15 08:24:27

标签: python mocking

我正在使用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)

我已经阅读了文档,但没有找到解释。也许他们是测试的条款?如果有人能提供信息会很好,谢谢。

2 个答案:

答案 0 :(得分:13)

Python 3.x中的

unittest.mockmock基本相同。

根据unittest.mock文档:

  

spec :这可以是字符串列表或现有对象(a   作为模拟对象的规范的类或实例)。   如果传入一个对象,则通过调用形成一个字符串列表   对象上的目录(不包括不受支持的魔法属性和   方法)。访问不在此列表中的任何属性将引发   AttributeError的。

     

如果spec是一个对象(而不是一个字符串列表)那么__class__   返回spec对象的类。这允许嘲笑通过   实例测试。

     

spec_set :更严格的规范变体。如果使用,尝试设置或   获取一个不在传递的对象上的mock的属性   spec_set将引发AttributeError。


更新 specspec_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。