Тестовые предупреждения для дополнительных пакетов

Мой код предоставляет дополнительные функции, которые используют дополнительные пакеты.

Когда пользователь импортирует пакет, который содержит эти дополнительные функции, отображается предупреждение, если у него / нее не установлен дополнительный пакет. Например:

Пожалуйста, установите optional-package использовать все функции

Чтобы протестировать эти дополнительные функции, дополнительный пакет устанавливается как зависимость в virtualenv, tox создает:

# tox.ini
[my-env]
deps = optional-package

Проблема в том, что я хочу проверить это:

  1. Предупреждение отображается, когда у пользователя не установлен пакет
  2. Предупреждение не отображается, когда у пользователя есть пакет

Тем не менее, кажется, что Python не предоставляет способ выгрузки пакетов.

Как я могу создать тест для описания контекста, в котором у пользователя нет дополнительного пакета в его системе, если в то же время мне нужно tox автоматически установить его как зависимость?

1 ответ

Решение

Вот один из способов проверить это some_module выдает предупреждение, когда optional.package не доступен:

import some_module

# ...

    @mock.patch.dict("sys.modules", {"optional.package": None})
    def test_warning_optional_package_not_installed(self):
        with self.assertWarns(SomeWarning):
            imp.reload(some_module)

Кроме того, вы можете определить несколько сред тестирования в вашем tox.ini файл, с дополнительными пакетами и без них. Вы можете настроить tox для установки переменных среды в зависимости от того, был ли установлен пакет:

[tox]
envlist = {with,without}_optional

[testenv]
basepython = python3.5
deps =
    required-package
    with_optional: optional-package
setenv = 
    with_optional: OPTIONAL_PACKAGE_AVAILABLE = true
commands = python -m unittest tests

Затем вы можете включать и отключать тесты на основе значения переменной среды:

@unittest.skipUnless(os.env["OPTIONAL_PACKAGE_AVAILABLE"] == "true")
def test_no_warning_optional_package(self):
    with warnings.catch_warnings(record=True) as w:
        imp.reload(some_module)
    self.assertFalse(w)
Другие вопросы по тегам