在python中单元测试假定义

时间:2017-09-27 06:31:50

标签: python unit-testing pytest

我有一个模块导入其他模块,但在defenition中有错误。 我需要对它进行测试,但是当我导入它时会引发错误。

我已经尝试了pytest模拟,但它在修改后修补了对象。

1 个答案:

答案 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