Python :模拟引发异常的模块

Python : Mock a module that raises an exception

我需要测试导入另一个模块的模块中的函数,该模块在导入时引发异常。

#a.py
raise ValueError("hello")
my_const = 'SOMETHING'


#b.py
from a import my_const 

def foo():
    # do something with my_const 
    return "expected_result"  

#test_foo.py
def test_foo():
    from b import foo
    assert foo() == "expected_result"

在这里,当我在 test_foo.py 中导入 foo 时,a.py 在 b.py 中导入,出现异常并且导入从未完成,因此 my_const 不可用在 b.py.

我不允许修改 a.py 或 b.py。此外,使用 unittest.patch@patch('a', 'my_const') 确实会导入 a.py,因此它不起作用。

可以使用 import lib 动态创建模块并将其添加到 sys.modules,但是是否有另一种不需要 importlib 的解决方案?

据我所知,您可以动态创建和导入模块。这是一个代码灵感来自 "Approximating importlib.import_module()" import lib documentation 部分

from importlib.util import module_from_spec, find_spec
import sys

def patched_import(name, **kwargs):
    spec = find_spec(name)
    m = module_from_spec(spec)

    for k in kwargs:
        setattr(m, k, kwargs[k])
    sys.modules[name] = m 

编辑:我的解决方案对于模型应该没问题,但要小心,因为对引用的操作可能会产生副作用。

要使用它,只需执行以下操作:

patched_import('a', my_const='stuff')

导入前 b.py。