I have a test that makes sure a specific (helpful) error message is raised, when a required package is not available.
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')
However, pkg
is generally available, as other tests rely on it.
Currently, I set up an additional virtual env without pkg
just for this test. This seems like overkill.
Is it possible to "hide" an installed package within a module or function?
I ended up with the following pytest-only solution, which appears to be more robust in the setting of a larger project.
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')