使用pytest检查应用程序文件是否导入了模块?



操作失败:

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

NB事物都是用常规的"src"one_answers";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啮齿动物建议防止双重加载。

最新更新