使用 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 的建议防止双重加载。