Python 3除了模块中的外部函数外,如何编写try的单元测试

问题描述

我想知道如何为try except块编写Python3单元测试 在Python模块中的函数定义之外定义的。

想象一下,在package/module.py中,我有一个挡路代码,如下所示:

导入操作系统

try:
  CONSTANT = os.environ['NOT_EXISTING_KEY']
except KeyError:
  CONSTANT = False
finally:
  del os

(请不要介意实际代码,我知道我本可以使用os.getenv('NOT_EXISTING_KEY', False)在此特定情况下,我真正感兴趣的是测试try-模块(函数外部)中的挡路除外)是否按预期运行。

如何编写单元测试来检查package.module.CONSTANT是否设置为预期值?

在单元测试文件(我使用pytest)中,我有如下内容:

from package.module import CONSTANT

def test_constant_true():
  assert CONSTANT == 'expected_value'

若要测试"尝试挡路"是否正确执行,则常量是否如预期。

但是,我不知道如何模拟导入机制,以便试用挡路中的os.environ引发异常,并且我可以测试该常量设置为false。

我如何才能做到这一点?


解决方案

可以使用monkeypatch设置环境变量,但必须重新加载模块才能使更改生效:

from importlib import reload

from package import module


def test_constant_true(monkeypatch):
    monkeypatch.setenv('MY_KEY', '42')
    reload(module)
    assert module.CONSTANT == '42'


def test_constant_false():
    reload(module)
    assert not module.CONSTANT

给定package/module.py的内容:

import os

try:
    CONSTANT = os.environ['MY_KEY']
except KeyError:
    CONSTANT = False

相关文章