强制迭代生成器以查看异常

时间:2016-04-17 11:29:45

标签: python python-3.x exception generator pytest

我有一个基本的生成器函数,如果在执行任何yield之前它的参数不正确,就会引发异常。

def my_generator(n):
    if not isistance(n, int):
        raise TypeError("Expecting an integer")

    for i in range(1, 3):
        yield n

我想用单元测试覆盖整个项目,所以我实现了这个测试功能:

import pytest
from my_package import my_generator

@pytest.mark.parametrize("n, expected_exception", [
    ("1", TypeError),  (1.0, TypeError), ([1], TypeError)
])
def test_my_generator_with_bad_parameters(n, expected_exception):
    with pytest.raises(expected_exception):
        my_generator(n)

但是当我正在运行pytest时,我得到了:

  

失败:DID NOT RAISE

但是,如果我修改我的测试以迭代生成的生成器,则测试通过。

def test_my_generator_with_bad_parameters(n, expected_exception):
    res = my_generator(n)
    with pytest.raises(expected_exception):
        next(res)

我应该怎么写这个测试?有没有办法修改my_generator以便我的单元测试的第一个实现通过(假设函数仍然是生成器)?

1 个答案:

答案 0 :(得分:1)

通常,等待异常是可以的,直到你的生成器实际被使用,因为大多数情况下,这是在同一for - 语句或list调用中完成的。 如果您当时确实需要检查,则生成生成器,您可以将生成器包装在内部函数中:

def my_generator(n):
    if not isistance(n, int):
        raise TypeError("Expecting an integer")
    def generator():
        for i in range(1, 3):
            yield n
    return generator()