我有一个测试,可确保在所需的包不可用时引发特定的(有用的)错误消息。
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不仅仅是为了这个测试。这似乎有点矫枉过正。
是否可以在模块或函数中“隐藏”已安装的包?
我最终得到了以下仅 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)
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |