Python 3 как написать модульные тесты для попытки, кроме внешних функций в модулях - PullRequest
1 голос
/ 15 апреля 2020

Я хотел бы знать, как написать Python 3 unittest для try except блоков, которые определены вне определений функций в модуле Python.

Представьте, что в package/module.py у меня есть блок кода, такой как:

import os

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

(пожалуйста, не обращайте внимания на реальный код, я знаю, что я мог бы использовать os.getenv('NOT_EXISTING_KEY', False) в этом конкретном случае c, то, что меня интересует, - это действительно тестирование того, что блок try-exc в модуле (вне функции) ведет себя как положено.

Как мне написать модульный тест, который проверяет, что package.module.CONSTANT установлен в ожидаемое значение?

В файле unittest (я использую pytest) у меня есть что-то вроде:

from package.module import CONSTANT

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

, чтобы проверить, что если блок try выполнен правильно, то CONSTANT соответствует ожидаемому.

Однако я не знаю, как смоделировать механизм импорта, чтобы os.environ в блоке try выдало исключение, и я могу проверить, что CONSTANT имеет значение False.

Как я могу сделать это?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вы можете использовать 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
0 голосов
/ 15 апреля 2020

Вы можете смоделировать окружение, используя 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, с которым я не знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...