Ошибка фиктивного импорта - PullRequest
1 голос
/ 18 июня 2020

Как заставить import pkg не работать в moduleA.py? Я могу исправить pkg, чтобы он не сработал, если что-то из него импортировано, но не иначе:

# test.py
import os
import moduleA
from unittest.mock import patch
from importlib import reload

@patch.dict('sys.modules', pkg=os)
def test_mock():
    reload(moduleA)
# moduleA.py
import pkg           # make this fail
from pkg import sum  # this does fail

Живой пример

1 Ответ

1 голос
/ 18 июня 2020

Это немного сложнее. Вы должны убедиться, что перезагрузка не удалась - это можно сделать, добавив класс, реализующий find_spec. Во-вторых, вы должны удалить уже загруженный пакет из sys.modules - иначе он будет использован при перезагрузке:

import sys
from importlib import reload

import pytest

import moduleA


class ImportRaiser:
    def find_spec(self, fullname, path, target=None):
        if fullname == 'pkg':
           # we get here if the module is not loaded and not in sys.modules
            raise ImportError()


sys.meta_path.insert(0, ImportRaiser())


def test_import_error():
    if 'pkg' in sys.modules:
        del sys.modules['pkg']

    with pytest.raises(ImportError):
        reload(moduleA)
...