我有一个模块导入其他模块,但在defenition中有错误。 我需要对它进行测试,但是当我导入它时会引发错误。
我已经尝试了pytest模拟,但它在修改后修补了对象。
答案 0 :(得分:0)
听起来你正试图以错误的方式做某事,但无论如何都要做到这一点。如果在测试环境中导入期间子模块出现故障,您可以在导入之前将伪模块加载到sys.modules
。这样,子模块已经加载,并且它不会尝试导入真实的子模块。
我创建了一个语法错误的模块:
# broken.py
def disembodied_function():
然后我写了导bar.py
的{{1}}。
broken.py
# bar.py
from broken import disembodied_function
def do_bar():
return disembodied_function()
导入。
foo.py
现在,如果我运行# foo.py
from bar import do_bar
print(do_bar())
,我会得到python3 foo.py
。
SyntaxError
要解决此问题,我可以在导入$ python3 foo.py
Traceback (most recent call last):
File "foo.py", line 3, in <module>
from bar import do_bar
File "/home/don/workspace/scratch/bar.py", line 3, in <module>
from broken import disembodied_function
File "/home/don/workspace/scratch/broken.py", line 3
def disembodied_function():
^
SyntaxError: unexpected EOF while parsing
$
之前插入虚假版本的broken
模块。这是bar
的新版本:
foo.py
现在它可以在没有投诉的情况下导入# foo2.py
import imp
import sys
mock_broken = imp.new_module('broken')
mock_broken.disembodied_function = lambda: 42
sys.modules['broken'] = mock_broken
from bar import do_bar
print(do_bar())
,并且会调用虚假版本的bar
。
broken