Skip to main content

使用 pytest.raises 启用异常实例的插件

项目描述

皮皮 版本 行动

https://user-images.githubusercontent.com/6615374/50065259-46af2780-017b-11e9-8af3-38f340f11df1.png

pytest-葡萄干

插件为pytest.raises提供了更高级别的接口。它允许使用异常实例作为预期值,该值将根据类型和args属性与实际异常(如果有)进行比较。

# Old-skool:
with pytest.raises(SystemExit) as cm:
    sys.exit(1)
assert cm.value.args == (1,)

# New hotness:
with pytest.raises(SystemExit(1)):
    sys.exit(1)

如有必要,可以为用户定义的错误子类注册更复杂的比较(请参阅高级用法)。

安装

pip install pytest-raisin

基本用法

测试中的用法如下所示

>>> currant_exchange_rates = {
...     "sultana": 50,
...     "raisins": 100,
... }
>>> with pytest.raises(KeyError("grape")):
...     currant_exchange_rates["grape"]
...
>>> with pytest.raises(KeyError("sultanas")):
...     currant_exchange_rates["prunes"]
...
AssertionError: KeyError args do not match!
    Actual:   ('prunes',)
    Expected: ('sultanas',)

>>> with pytest.raises(KeyError("Carlos Sultana")):
...     currant_exchange_rates["sultana"]
Failed: DID NOT RAISE KeyError('Carlos Sultana')

该插件默认启用:pytest.raises直接使用新功能进行了猴子补丁。要在没有新内容的情况下暂时执行,请使用pytest -p no:pytest-raisin

pytest.raises的各种遗留形式将继续工作,回退到原始实现。

高级用法

在大多数用例中,如果args属性具有匹配的元组,则将异常视为等效的默认行为应该是令人满意的。但是,一些 3rd-party 异常类在它们内部有额外的逻辑(例如 Django 的ValidationError),您可能希望在此处提供更自定义的断言。

插件用户可以通过 pytest-raisin 的装饰器工厂注册他们自己的错误/可调用对象:

@pytest.register_exception_compare(MyError)
def my_error_compare(exc_actual, exc_expected):
    ...

您的比较函数将使用参数exc_actualexc_expected 调用,这两个参数都是MyError的直接实例(如果类型不完全匹配,则测试将提前失败)。如果认为实例不匹配,此函数应检查实例并使用有用的上下文消息引发AssertionError 。如果异常应该被认为是等效的,它应该什么都不做(即返回None )。

注意:当使用异常实例作为pytest.raises的参数时,不允许使用子类的实例。如果要允许子类化,请使用传递类型的原始语法。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

pytest-raisin-0.4.tar.gz (3.7 kB 查看哈希)

已上传 source

内置分布

pytest_raisin-0.4-py2.py3-none-any.whl (4.6 kB 查看哈希)

已上传 py2 py3