我的理解是,MagicMock是一个自动执行“神奇方法”的超集,从而无缝地提供对列表、迭代等的支持.那么,朴素面具存在的原因是什么呢?这不只是一个可以被忽略的精简版本的MagicMock吗?Mock类是否知道在MagicMock中不可用的任何技巧
发布于 2014-04-11 12:42:33
朴素的面具存在的原因是什么?
Mock的作者Michael向2011年Pycon的一个非常相似的问题(31:00)发表讲话
Q:,为什么MagicMock做了一个单独的东西,而不是仅仅将功能折叠到默认的模拟对象中? A:一个合理的答案是,MagicMock的工作方式是通过创建新的Mocks并设置它们来对所有这些协议方法进行预配置,所以如果每个新的MagicMock创建了一组新的模拟并将它们设置为协议方法,那么所有这些协议方法都创建了更多的模拟,并在它们的协议方法上设置了它们,那么您就会得到无限的递归. 如果您希望将模拟作为容器对象访问为一个错误--您不希望这样做?如果每个模拟都自动获得了每个协议方法,那么这样做就变得更加困难了。而且,MagicMock还为您做了一些预配置,设置了可能不合适的返回值,所以我认为最好让这个方便的值为您预先配置和可用,但您也可以使用一个普通的模拟对象,只配置您想要存在的神奇方法. 简单的答案是:只要在任何地方都使用MagicMock,如果这是您想要的行为。
发布于 2013-06-19 04:16:03
使用Mock,您可以模拟魔术方法,但您必须定义它们。MagicMock有“大多数魔术方法的默认实现。”。
如果您不需要测试任何神奇的方法,那么Mock就足够了,并且不会在您的测试中带来很多无关的东西。如果您需要测试许多神奇的方法,MagicMock将为您节省一些时间。
发布于 2014-12-05 01:56:25
首先,MagicMock是Mock的子类。
class MagicMock(MagicMixin, Mock)因此,MagicMock提供了Mock提供的所有内容以及更多内容。与其把Mock看作是精简的MagicMock版本,不如把MagicMock看作是Mock的扩展版本。这将解决您关于为什么存在Mock以及Mock在MagicMock之上提供了什么的问题。
其次,MagicMock提供了许多/大多数魔术方法的默认实现,而Mock没有。有关提供的魔术方法的更多信息,请参见这里。
提供的魔术方法的一些例子:
>>> int(Mock())
TypeError: int() argument must be a string or a number, not 'Mock'
>>> int(MagicMock())
1
>>> len(Mock())
TypeError: object of type 'Mock' has no len()
>>> len(MagicMock())
0这些可能不那么直观(至少对我来说不是直觉):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>您可以“看到”添加到MagicMock中的方法,因为这些方法是第一次调用的:
>>> magic1 = MagicMock()
>>> dir(magic1)
['assert_any_call', 'assert_called_once_with', ...]
>>> int(magic1)
1
>>> dir(magic1)
['__int__', 'assert_any_call', 'assert_called_once_with', ...]
>>> len(magic1)
0
>>> dir(magic1)
['__int__', '__len__', 'assert_any_call', 'assert_called_once_with', ...]那么,为什么不一直使用MagicMock呢?
问题是:您对默认的魔术方法实现是否满意?例如,mocked_object[1]可以不出错吗?由于神奇的方法实现已经存在,您对任何意外的后果是否满意?
如果这些问题的答案是“是”,那么请继续使用MagicMock。不然的话,就穿假面具吧。
https://stackoverflow.com/questions/17181687
复制相似问题