7

我有一个循环,我处理将记录添加到 zip 文件。我已经模拟了我的 zipfile 对象,我想引发一个异常来验证我处理大型 zipfile 的逻辑是否可以正常工作。

有没有办法使用 MagicMocks 或普通模拟来接受第一个调用,但在第二个调用时引发异常?

4

2 回答 2

26

最简单的方法是使用side_effect它接受可迭代、可调用或异常(类或实例)

或者side_effect可以是异常类或实例。在这种情况下,调用模拟时将引发异常。

快速指南中所示,您可以side_effect简单地使用引发异常

>>> mock = Mock(side_effect=KeyError('foo'))
>>> mock()
Traceback (most recent call last):
 ...
KeyError: 'foo'

side_effect此外,您可以在分配中同时使用列表和异常。所以做你需要的最简单的方法是这样的:

>>> m = Mock(side_effect=[1, KeyError("bar"), 3])
>>> m("a")
1
>>> m("b")
 ...
KeyError: 'bar'
>>> m("c")
3

另一种方法是使用可调用来编写模拟应如何反应的逻辑。在这种情况下,您可以根据参数或测试状态自由选择。

于 2015-04-16T06:50:09.883 回答
3

带有生成器和 Mock side_effect

from unittest.mock import Mock

def sample_generator():
    yield 1
    yield 2
    raise Exception()

gen = sample_generator()

def sideeffect():
    global gen
    for x in gen:
        return x


m = Mock(side_effect=sideeffect)
m() #1
m() #2
m() #3

你可以得到:

File "test.py", line 22, in <module>
   m() #3
   ....
   raise Exception()
Exception

我相信你可以通过一些努力让它稍微干净一些,但它应该可以解决你的基本问题

于 2015-04-15T15:54:02.817 回答