python - 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.patch
and@patch('a', 'my_const')
确实 importa.py
所以它不起作用。
可以使用 import lib 动态创建模块并将其添加到sys.modules
,但是是否有另一种不需要 importlib 的解决方案?
解决方案
据我所知,您可以动态创建和导入模块。这是受导入库文档中“近似 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 之前。
推荐阅读
- android - 如何将 scikit-learn 模型部署到 android?
- javascript - 使用反应文本到语音
- excel - Excel 的 VBA 编辑器中包含哪些库?是否有任何关于如何使用它们的正式文档?
- ios - swift 4.2 ios 12中的状态栏模糊视图(半透明)
- python-3.x - 如何在 PyQt5 中自定义 QWizard 的标题?
- actions-on-google - DeleteAgentUser (Google Homegraph) 的正确 uri
- geolocation - Spotfire 在同一地理代码中映射多个值
- arrays - 如何将数组放入 client.println("