【问题标题】:Forced to iterate over a generator to see the exception强制遍历生成器以查看异常
【发布时间】:2016-08-09 02:57:52
【问题描述】:

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

失败:没有提出

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

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

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

【问题讨论】:

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


    【解决方案1】:

    通常,等待异常是很正常的,直到你的生成器被实际使用,因为大多数时候,这是在同一个for-statement 或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()
    

    【讨论】:

    • 投反对票的人能解释一下这个解决方案有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 2013-01-30
    • 2016-11-05
    • 1970-01-01
    • 2010-12-21
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多