1

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

想象一下,package/module.py我有一段代码,例如:

导入操作系统

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

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

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

在 unittest 文件(我使用 pytest)中,我有类似的内容:

from package.module import CONSTANT

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

测试如果 try 块正确执行,那么 CONSTANT 是否符合预期。

但是,我不知道如何模拟导入机制,以便 try 块中的 os.environ 引发异常,并且我可以测试 CONSTANT 是否设置为 False。

我怎样才能做到这一点?

4

2 回答 2

2

您可以使用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
于 2020-04-15T11:40:38.147 回答
0

您可以使用单元测试方法模拟环境mock.patch.dict并导入该值。像这样:

from unittest import TestCase, mock

class YourTest(TestCase):
    @mock.patch.dict('os.environ', {'NOT_EXISTING_KEY': 'value'})
    def test_constant_key_defined(self, mocked):
        """ Tests when the key is defined """
        from package.module import CONSTANT
        self.assertEqual(CONSTANT, 'value')

    def test_constant_key_not_defined(self):
        """ Tests when the key is not defined """
        from package.module import CONSTANT
        self.assertEqual(CONSTANT, 'value')

您可以使用importlib.reload我不熟悉的,如@mrbean-bremen 的答案。

于 2020-04-15T13:19:25.653 回答