Выполнение теста Python на том, что установленный пакет недоступен - PullRequest
6 голосов
/ 14 февраля 2020

У меня есть тест, который проверяет наличие определенного c (полезного) сообщения об ошибке, когда требуемый пакет недоступен.

def foo(caller):
    try:
        import pkg
    except ImportError:
        raise ImportError(f'Install "pkg" to use {caller}')
    pkg.bar()

with pytest.raises(ImportError, match='Install "pkg" to use test_function'):
   foo('test_function')

Однако pkg равно обычно доступно, так как другие тесты полагаются на это. В настоящее время я настроил дополнительный виртуальный env без pkg только для этого теста. Это выглядит как перебор.

Можно ли "спрятать" установленный пакет в модуле или функции?

Ответы [ 2 ]

4 голосов
/ 14 февраля 2020

Я получил следующее решение, предназначенное только для pytest, которое представляется более надежным в настройках более крупного проекта.

import builtins
import pytest


@pytest.fixture
def hide_available_pkg(monkeypatch):
    import_orig = builtins.__import__

    def mocked_import(name, *args, **kwargs):
        if name == 'pkg':
            raise ImportError()
        return import_orig(name, *args, **kwargs)

    monkeypatch.setattr(builtins, '__import__', mocked_import)


@pytest.mark.usefixtures('hide_available_pkg')
def test_message():
    with pytest.raises(ImportError, match='Install "pkg" to use test_function'):
        foo('test_function')
2 голосов
/ 14 февраля 2020

Вы можете издеваться builtins.__import__.

from unittest import mock

import pytest


def foo(caller):
    try:
        import pkg
    except ImportError:
        raise ImportError(f'Install "pkg" to use {caller}')
    pkg.bar()

with mock.patch("builtins.__import__", side_effect=ImportError):
    with pytest.raises(ImportError, match='Install "pkg" to use test_function'):
        foo('test_function')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...