首页 > 解决方案 > Python:模拟引发异常的模块

问题描述

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

#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.patchand@patch('a', 'my_const') 确实 importa.py所以它不起作用。

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

标签: pythonpytestpatch

解决方案


据我所知,您可以动态创建和导入模块。这是受导入库文档中“近似 importlib.import_module()”部分启发的代码

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 之前。


推荐阅读