使 Python 测试认为已安装的软件包不可用

rvf*_*rvf 7 python pytest

我有一个测试,可确保在所需的包不可用时引发特定的(有用的)错误消息。

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')
Run Code Online (Sandbox Code Playgroud)

然而,pkg 一般可用,其他的测试依赖于它。目前,我设置了一个额外的虚拟环境, pkg不仅仅是为了这个测试。这似乎有点矫枉过正。

是否可以在模块或函数中“隐藏”已安装的包?

rvf*_*rvf 5

我最终得到了以下仅 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')
Run Code Online (Sandbox Code Playgroud)