使用Pytest固定装置推迟导入

时间:2018-08-31 17:40:23

标签: import module pytest maya

比方说,我必须导入在运行某些设置代码后才能导入的软件包(下面的说明)。

有没有办法将这些进口商品放入固定装置?

示例

这就是我认为应该起作用的地方:

import pytest


@pytest.fixture(scope='module')
def setup():
    print("Setup code")
    yield
    print("Tear down")


@pytest.fixture
def defer_imports():
    # requires some setup code to run first
    import re
    import sys
    return re, sys


def test_pattern(setup, defer_imports):
    pattern = re.compile('_.*')
    assert pattern.match("_private")
    print("pattern works!!")


def test_paths(setup, defer_imports):
    pattern = re.compile('site-packages')
    assert any(pattern.search(path) for path in sys.path)
    print("Site packages found!!")

...但是,运行此命令时,resys无法识别。

正当化

我需要这样做的原因是使用Autodesk的maya.cmds软件包进行测试,只有在“初始化”一个Maya会话(使用maya.standalone.initialize())之后,才能导入该软件包。这不仅仅是对sys.paths的简单修改。无论如何,关键是如果我在调用maya.cmds之前尝试导入initialize,整个测试模块将无法加载。

如果我将import语句复制到每个单独的测试中,则可以使测试运行,但是对于大型测试套件来说,这是不切实际的(而且很丑陋)。

跟进

看起来像是“ Id”错误地认为元组已从固定装置中拆开;相反,可以通过解压缩defer_imports对象来访问模块,如下所示:

def test_pattern(setup, defer_imports):
    re, sys = defer_imports
    pattern = re.compile('_.*')
    assert pattern.match("_private")
    print("pattern works!!") 

...这很有意义,但是这种方法仍然很笨拙。

0 个答案:

没有答案