首次通话后抛出异常

时间:2015-04-15 15:16:52

标签: python django mocking magicmock

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

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

2 个答案:

答案 0 :(得分:17)

最简单的方法是使用接受iterable,callable或Exception(类或实例)的side_effect

  

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

Quick Guide所示,您可以使用side_effect来简单地通过

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

此外,您可以在side_effect分配中一起使用list和Exception。因此,最简单的方法就是这样:

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

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

答案 1 :(得分: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

我确信你可以通过一些努力使它稍微清洁,但它应该解决你的基本问题