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

Forced to iterate over a generator to see the exception

我有一个基本的生成器函数,如果在执行任何 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 时,我得到:

Failed: 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 以便我的单元测试的第一个实现通过(假设函数仍然是生成器)?

通常情况下,等待异常是可以的,直到您的生成器被实际使用,因为大多数时候,这是在相同的 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()