我有一段代码可以调用集合中每个项上的一系列方法,每个方法都返回一个布尔值,指示success=True/failure=False。在
def monkey(some_collection, arg1, arg2):
for item in some_collection:
if not item.foo(arg1, arg2):
continue
if not item.bar(arg1, arg2):
continue
if not item.baz(arg1, arg2):
continue
下面是我的单元测试示例:
^{pr2}$实际通话
call().foo(<MagicMock id='12345'>, 1, 2)
call().foo.__nonzero__()
。。。在
注意:这个单元测试失败是因为它看到了__nonzero__()
方法调用。
问题
为什么要添加非零方法调用?在
澄清
我使用的是mock,从python3.3开始,它就包含在stdlib中。在
简短回答:
如果mocked函数没有显式的返回值或返回的副作用,那么Python将尝试评估mock的真实性。确保你的模拟有一个。在
或者用一个初始化:
或添加一个:
^{pr2}$说明:
当你做}。在
if not x:
时,你可能在想{Python实际上并没有做到这一点,它确实做到了}),而{}实际上是对
if bool(x) is False
(这是Python的truthiness概念,值的计算结果是True
或{x.__nonzero__()
(或3.x中的x.__bool__()
)的调用。在这是为了提供Python良好的
if
行为——当你做if []:
时,很多语言都会将任何对象视为True
,但是Python的设计目的是使代码可读,因此它进行委托,如果列表的__nonzero__()
方法将返回False
。这允许更多的代码读得更自然,并解释了为什么会看到这些调用。在相关问题 更多 >
编程相关推荐