为什么mock会添加非零方法调用?

2024-09-28 21:05:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码可以调用集合中每个项上的一系列方法,每个方法都返回一个布尔值,指示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}$

实际通话

  1. call().foo(<MagicMock id='12345'>, 1, 2)
  2. call().foo.__nonzero__()

。。。在

注意:这个单元测试失败是因为它看到了__nonzero__()方法调用。

问题

为什么要添加非零方法调用?在

澄清

我使用的是mock,从python3.3开始,它就包含在stdlib中。在


Tags: 方法代码iffoonotsome单元测试call
1条回答
网友
1楼 · 发布于 2024-09-28 21:05:33

简短回答:

如果mocked函数没有显式的返回值或返回的副作用,那么Python将尝试评估mock的真实性。确保你的模拟有一个。在

或者用一个初始化:

item = MagicMock(return_value=True)

或添加一个:

^{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。这允许更多的代码读得更自然,并解释了为什么会看到这些调用。在

相关问题 更多 >