如何在生成器对象中使用unittest的self.assertRaises和异常?

Nie*_*ein 10 python unit-testing generator

我有一个我想要进行单元测试的发电机对象.它经历一个循环,当在循环结束时,某个变量仍为0我引发异常.我想对此进行单元测试,但我不知道如何.以此示例生成器为例:

class Example():
    def generatorExample(self):
        count = 0
        for int in range(1,100):
            count += 1
            yield count   
        if count > 0:
             raise RuntimeError, 'an example error that will always happen'
Run Code Online (Sandbox Code Playgroud)

我想做的是

class testExample(unittest.TestCase):
    def test_generatorExample(self):
        self.assertRaises(RuntimeError, Example.generatorExample)
Run Code Online (Sandbox Code Playgroud)

但是,生成器对象不是可密封的,这给出了

TypeError: 'generator' object is not callable
Run Code Online (Sandbox Code Playgroud)

那么如何测试生成器函数中是否引发异常?

Jak*_*cil 25

assertRaises 是自Python 2.7以来的上下文管理器,所以你可以这样做:

class testExample(unittest.TestCase):

    def test_generatorExample(self):
        with self.assertRaises(RuntimeError):
            list(Example().generatorExample())
Run Code Online (Sandbox Code Playgroud)

如果你有Python <2.7那么你可以使用a lambda来耗尽生成器:

self.assertRaises(RuntimeError, lambda: list(Example().generatorExample()))
Run Code Online (Sandbox Code Playgroud)