模拟导入失败

时间:2020-06-18 16:39:47

标签: python python-3.x mocking pytest python-unittest

如何使import pkgmoduleA.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

Live example

1 个答案:

答案 0 :(得分:1)

这有点复杂。您必须确保重新加载失败-这可以通过添加实现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)