gpt4 book ai didi

python - doctest 中的链式异常

转载 作者:太空狗 更新时间:2023-10-30 03:05:56 31 4
gpt4 key购买 nike

我已经编写了一个用于测试的assert_raised 上下文管理器,它检查是否按预期引发异常,如果没有引发AssertionError。我还写了一个 doctest 来测试这个,但是 doctest 一直失败,我不完全确定为什么。这是教科书:

>>> for e in [TypeError, ValueError, KeyError]:
... with assert_raised(TypeError, ValueError):
... print('Raising {}...'.format(e.__name__))
... raise e
Raising TypeError...
Raising ValueError...
Raising KeyError...
Traceback (most recent call last):
...
AssertionError: Got 'KeyError', expected 'TypeError, ValueError'

实际引发的异常是:

Traceback (most recent call last):
File "<doctest dtlibs.mock.assert_raised[3]>", line 4, in <module>
raise e
KeyError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python32\lib\doctest.py", line 1253, in __run
compileflags, 1), test.globs)
File "<doctest dtlibs.mock.assert_raised[3]>", line 4, in <module>
raise e
File "G:\Projects\Programming\dt-tools\dtlibs\dtlibs\mock.py", line 274, in __exit__
raise self._exception(exc_type.__name__)
AssertionError: Got 'KeyError', expected 'TypeError, ValueError'

我不认为实现很重要,但这是为了防止我在那里做错了什么(没有 doctest):

class assert_raised:

def __init__(self, *exceptions):
self.exceptions = exceptions

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
raise self._exception('None')
elif self.exceptions and exc_type not in self.exceptions:
raise self._exception(exc_type.__name__)
return True

def _exception(self, got):
if len(self.exceptions) == 0:
expected = 'an exception'
else:
expected = ', '.join(e.__name__ for e in self.exceptions)
msg = "Got '{}', expected '{}'".format(got, expected)
return AssertionError(msg)

最佳答案

Doctests 有专门的代码来处理抛出的异常。因此,它会识别输出何时是异常。为了识别这一点,预期的输出必须以单词 Traceback 开头。您预期的输出不以此开头,因此,doctest 不会将输出识别为预期异常,因此,它不会预期异常,因此当异常出现时,它将失败。

您可以通过三种方式解决此问题:

  1. 去掉输出中的 Raising XXXError... 部分。 [偷懒]

  2. 为 doctest 实现特殊的输出过滤器,使 doctest 能够忽略 Raising XXXError...-part [complicated]

  3. 停止将 doctests 用于测试文档以外的其他用途。 [正确]

上面的代码显然不是如何使用上下文管理器的示例代码,它是测试上下文管理器工作的代码。这样的测试永远不应该是doctests。 Doctest 是痛苦且有限的,应该只用于测试文档。

关于python - doctest 中的链式异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10084235/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com