我在从pytest访问部分导入模块时遇到问题。
以下是代码引用的分支:https://github.com/asvc/snapshotr/tree/develop
特别是,在运行此测试时,它会按预期运行test_correct_installation()
,但test_script_name_checking()
会因AttributeError而失败。
import main as ss
import os
class TestInit:
def test_correct_installation(self):
assert os.path.exists(ss.snapr_path)
assert os.path.isfile(ss.snapr_path + "/main/markup.py")
assert os.path.isfile(ss.snapr_path + "/main/scandir.py")
def test_script_name_checking(self):
assert ss.ssPanel.check_script('blah') is None # Here it fails
Link to the main
which is being tested
我想要做的是提取"提取"隔离的一段代码,用已知数据运行它并将结果与一些参考进行比较。似乎提取部分不能很好地工作,非常感谢这些案例的最佳实践。
回溯:
AttributeError: 'module' object has no attribute 'ssPanel'
我在test_init.py
:
class dummy():
pass
nuke = dummy()
nuke.GUI = True
但它(显然)并不起作用,因为nuke.GUI
在每次发布时都会在__init__.py
中重新定义。
答案 0 :(得分:1)
这是一个相当复杂的情况。当您在main
中导入test_init.py
时,它将导入main/__init__.py
并执行所有代码。这会导致nuke
被导入,如果nuke.GUI
为False,则不会有ssPanel
,如您所见。
问题在于,您无法在测试脚本中伪造虚拟核武器。它不会起作用。因为在测试运行之前,真正的核武器已经导入了。
我的建议是将ssPanel
分隔到另一个python文件中。然后在__init__.py
我们可以做到:
if nuke.GUI:
from sspanel import ssPanel
在测试脚本中,我们也可以使用以下方法轻松导入它:
from main.sspanel import ssPanel