我试图理解这两种模拟结构之间的区别,以及何时使用这两种结构是合适的。我在解释器中进行了测试,例如:
>>> 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
创建的mock“构造”给了我一个NonCallableMagicMock
,而MagicMock
给了我更多的MagicMock
。这个documentation帮不了什么忙
使用
spec
参数和使用create_autospec
之间的主要区别是递归性。在第一种情况下,对象本身是特定的,而被调用的对象不是:在第二种情况下,调用的对象也被指定(延迟):
有一个警告,显示在示例代码中。如果如图所示使用
create_autospec
,它的行为就像对象是类而不是实例一样,因此您可以调用它(创建实例):如果您想让它像一个实例一样运行,您必须使用
instance=True
:请注意,将
mock.patch
与autospec=True
一起使用会创建一个模仿,其行为类似于使用mock.create_autospec
创建的模仿,如documentation中所述还请注意,调用的返回值始终是
MagicMock
,而与实际调用的返回值无关。因此,即使函数返回None
,如list.append
,如果从模拟调用方法,则返回模拟,而不考虑规范相关问题 更多 >
编程相关推荐