什么是spec和spec_set

Hel*_*lad 16 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)
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)