我有一个基本的生成器函数,如果在执行任何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
以便我的单元测试的第一个实现通过(假设函数仍然是生成器)?
答案 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()