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

Python 强制在生成器上迭代以查看异常,python,python-3.x,exception,generator,pytest,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 impor

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

失败:未引发

但是,如果我修改我的测试来迭代生成的生成器,测试就会通过

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

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

通常,在实际使用生成器之前等待异常是可以的,因为大多数时候,这是在相同的
for
-语句或
列表
调用中完成的。 如果您在生成生成器时确实需要检查,您可以将生成器包装在内部函数中:

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)
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()

选民能否解释这个解决方案的错误?