从pytes访问模块的一部分

2024-10-03 15:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在从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 ^{} 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中重新定义。你知道吗


Tags: path代码namepytestosmainscript
1条回答
网友
1楼 · 发布于 2024-10-03 15:31:36

这是一个相当复杂的情况。在test_init.py中导入main时,它将导入main/__init__.py并执行所有代码。这将导致nuke被导入,而且,如果nuke.GUI为False,则不会有ssPanel,如您所见。你知道吗

问题是,你不能在测试脚本中伪造假核弹。这行不通。因为在测试运行之前,真正的核弹已经被导入了。你知道吗

我的建议是将ssPanel分离到另一个python文件中。然后在__init__.py我们可以做:

if nuke.GUI:
    from sspanel import ssPanel

在测试脚本中,我们还可以使用以下方法轻松导入:

from main.sspanel import ssPanel

相关问题 更多 >