使用 pytest 检查应用程序文件是否导入了模块?
Use pytest to check that an application file imports a module?
这失败了:
def test_main_imports_pathlib():
print(f'"pathlib" in sys.modules {"pathlib" in sys.modules}') # prints "True"
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
import core.__main__
assert 'pathlib' in sys.modules
但 __main__.py
看起来像这样:
import pathlib
注意事项是使用常规的“src”和“tests”顶级目录设置的,是的,__main__.py
肯定会在上述测试中导入。
有没有办法使用pytest测试应用程序文件是否导入模块?我愿意接受这样的想法,即这可能会被视为“实施细节”,我应该测试更大的东西。但事实上,我认为这是您可能有理由检查的一个简单示例:什么导入什么...
事实上,我想了解为什么上面的失败。
您的问题很可能是 core.__main__
已经加载,并且导入它不会再次加载它。您还必须从模块缓存中删除该模块,例如类似于:
def test_main_imports_pathlib():
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
if '__main__' in sys.modules:
del sys.modules['__main__']
import core.__main__
assert 'pathlib' in sys.modules
另一种可能性是强制重新加载导入的模块:
from importlib import reload
def test_main_imports_pathlib():
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
main_loaded = 'core.__main__' in sys.modules
import core.__main__
if main_loaded:
reload(core.__main__)
assert 'pathlib' in sys.modules
如评论中所述,第二个版本不依赖模块缓存中模块的正确名称,因此更可靠。
更新:根据 mike rodent 的建议防止双重加载。
这失败了:
def test_main_imports_pathlib():
print(f'"pathlib" in sys.modules {"pathlib" in sys.modules}') # prints "True"
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
import core.__main__
assert 'pathlib' in sys.modules
但 __main__.py
看起来像这样:
import pathlib
注意事项是使用常规的“src”和“tests”顶级目录设置的,是的,__main__.py
肯定会在上述测试中导入。
有没有办法使用pytest测试应用程序文件是否导入模块?我愿意接受这样的想法,即这可能会被视为“实施细节”,我应该测试更大的东西。但事实上,我认为这是您可能有理由检查的一个简单示例:什么导入什么...
事实上,我想了解为什么上面的失败。
您的问题很可能是 core.__main__
已经加载,并且导入它不会再次加载它。您还必须从模块缓存中删除该模块,例如类似于:
def test_main_imports_pathlib():
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
if '__main__' in sys.modules:
del sys.modules['__main__']
import core.__main__
assert 'pathlib' in sys.modules
另一种可能性是强制重新加载导入的模块:
from importlib import reload
def test_main_imports_pathlib():
if 'pathlib' in sys.modules:
del sys.modules['pathlib']
main_loaded = 'core.__main__' in sys.modules
import core.__main__
if main_loaded:
reload(core.__main__)
assert 'pathlib' in sys.modules
如评论中所述,第二个版本不依赖模块缓存中模块的正确名称,因此更可靠。
更新:根据 mike rodent 的建议防止双重加载。