【问题标题】:Mock import failure模拟导入失败
【发布时间】:2020-06-19 01:49:20
【问题描述】:

如何使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

【问题讨论】:

  • @patch('pkg') 应该这样做。编辑:但补丁需要在你导入 moduleA 之前发生
  • @jordanm TypeError: Need a valid target to patch. You supplied: 'pkg'。并且moduleAtest_mock 中导入,然后重新加载(但在此之前引发 TypeError)

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 2011-11-13
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2013-12-03
    相关资源
    最近更新 更多