Python:模拟引发异常的模块

时间:2019-09-30 12:11:58

标签: python pytest patch

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

#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,在b.py中导入a.py时,会引发异常并且导入从未完成,因此my_const在b.py中不可用。

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

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

1 个答案:

答案 0 :(得分:1)

据我所知,您可以动态创建和导入模块。这是从 import lib documentation

中的“近似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之前。