强制迭代生成器以查看异常
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()
我有一个基本的生成器函数,如果在执行任何 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()