模拟迭代器以引发异常

2024-05-18 01:34:36 发布

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

我在使用python2.7.15rc1。我试图模仿迭代器,以便它在迭代时抛出异常。 例如:

elements = [1,2,3,Exception('boom!')]
iterable = <create a mock iterable to iterate over "elements">

# this does not print anything.
for value in iterable:
   ...

我尝试过在MagicMock实例的next()方法上使用side_effect属性,如下所示:

^{pr2}$

我假设for循环将在mocked_iterable上调用__iter__,这将返回另一个模拟对象,其next属性具有side_effect。我的期望是循环将以调用mocked_next.next()结束,它将迭代我在side_effect中提供给它的列表。在

显然,我的理解是不正确的。我错过了什么?这可以完全使用mock实现吗,还是必须创建一个自定义迭代器来实现这种行为?在

编辑:我试图测试一段代码的异常处理部分,该代码迭代iterable,因此尝试模拟迭代器引发异常。在


Tags: to代码for属性createexceptionelementsiterable
1条回答
网友
1楼 · 发布于 2024-05-18 01:34:36

您要查找的内容不适合MagicMock,因为side_effect可以是异常,也可以是iterable,但不能两者都是。您应该使用__iter__方法创建一个类,该方法按给定的序列生成项,然后引发给定的异常:

class ExceptionRaisingIterable:
    def __init__(self, seq, exception):
        self.seq = seq
        self.exception = exception

    def __iter__(self):
        for i in self.seq:
            yield i
        raise self.exception

for value in ExceptionRaisingIterable([1, 2, 3], Exception('boom!')):
    print(value)

该输出:

^{pr2}$

相关问题 更多 >