pythonpytest

Making a Python test think an installed package is not available


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?


Solution

  • 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')