我需要在一个模块中测试一个函数,该模块可以导入另一个模块,该模块在导入时会引发异常。
#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的解决方案吗?
答案 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之前。