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。
我需要测试导入另一个模块的模块中的函数,该模块在导入时引发异常。
#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。