比方说,我必须导入在运行某些设置代码后才能导入的软件包(下面的说明)。
有没有办法将这些进口商品放入固定装置?
这就是我认为应该起作用的地方:
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!!")
...但是,运行此命令时,re
和sys
无法识别。
我需要这样做的原因是使用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!!")
...这很有意义,但是这种方法仍然很笨拙。