作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解这两种模拟构造之间的区别,以及何时适合使用它们。我在解释器中对其进行了测试,例如:
>>> mm = mock.MagicMock(spec=list)
>>> ca = mock.create_autospec(list)
>>> mm
<MagicMock spec='list' id='140372375801232'>
>>> mm()
<MagicMock name='mock()' id='140372384057808'>
>>> mm.append()
<MagicMock name='mock.append()' id='140372375724720'>
>>> mm().append()
<MagicMock name='mock().append()' id='140372375753104'>
>>> ca
<MagicMock spec='list' id='140372384059248'>
>>> ca()
<NonCallableMagicMock name='mock()' spec='list' id='140372384057040'>
>>> ca.append()
<MagicMock name='mock.append()' id='140372375719744'>
>>> ca().append()
<MagicMock name='mock().append()' id='140372375796848'>
>>>
但我不明白为什么“构建”使用
create_autospec
创建的模拟给我一个
NonCallableMagicMock
和
MagicMock
给我更多
MagicMock
.
documentation没有多大帮助。
最佳答案
使用 spec
的主要区别参数和使用 create_autospec
是递归。在第一种情况下,对象本身是指定的,而被调用的对象不是:
>>> mm = mock.MagicMock(spec=list)
>>> mm
<MagicMock spec='list' id='2868486557120'>
>>> mm.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python\Python38\lib\unittest\mock.py", line 635, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'foo'
>>> mm.append
<MagicMock name='mock.append' id='2868486430240'>
>>> mm.append.foo
<MagicMock name='mock.append.foo' id='2868486451408'>
在第二种情况下,被调用的对象也被指定(懒惰):
>>> ca = mock.create_autospec(list)
>>> ca
<MagicMock spec='list' id='2868486254848'>
>>> ca.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python\Python38\lib\unittest\mock.py", line 635, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'foo'
>>> ca.append
<MagicMock name='mock.append' spec='method_descriptor' id='2868486256336'>
>>> ca.append.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\Python\Python38\lib\unittest\mock.py", line 635, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'foo'
有一个警告,显示在您的示例代码中。如果您使用
create_autospec
如此处所示,它的行为就好像对象是一个类,而不是一个实例,因此您可以调用它(创建一个实例):
>>> ca = mock.create_autospec(list)
>>> ca()
<NonCallableMagicMock name='mock()' spec='list' id='2868485877280'>
如果你想把它表现得像一个实例,你必须使用
instance=True
:
>>> ca = mock.create_autospec(list, instance=True)
>>> ca
<NonCallableMagicMock spec='list' id='2868485875024'>
>>> ca()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NonCallableMagicMock' object is not callable
请注意,使用
mock.patch
与
autospec=True
创建一个模拟,其行为类似于使用
mock.create_autospec
创建的模拟。 ,如
documentation 中所述.
MagicMock
,不管实际调用的返回值如何。因此,即使函数返回
None
, 喜欢
list.append
,如果从模拟调用方法,则返回模拟,无论规范如何。
关于python - mock.MagicMock(spec=SomeClass) 和 mock.create_autospec(SomeClass) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63528693/
我正在玩弄 Python 中的模拟自动规范。这是一个基本测试用例,其中我使用 create_autospec 自动指定 Django User 类. from unittest.mock import
我试图了解这两种模拟构造之间的区别,以及何时适合使用它们。我在解释器中对其进行了测试,例如: >>> mm = mock.MagicMock(spec=list) >>> ca = mock.crea
我是一名优秀的程序员,十分优秀!