使用 pytest 测试是否缺少导入

问题描述 投票:0回答:1

在我的项目的

__init__.py
文件中,我有以下代码,用于从
pyproject.toml
文件中检索程序的当前版本:

from typing import Any
from importlib import metadata

try:
    import tomllib

    with open("pyproject.toml", "rb") as project_file:
        pyproject: dict[str, Any] = tomllib.load(project_file)
    __version__ = pyproject["tool"]["poetry"]["version"]
except Exception as _:
    __version__: str = metadata.version(__package__ or __name__)

此代码在 Python 3.11 及更高版本上运行良好。然而,在旧版本上,

tomllib
不存在,因此应引发异常(并且版本将通过使用
metadata
来确定)

当使用

pytest
在 Python 3.11 上进行测试时,是否有任何方法可以设计一个测试来检查确定版本的方法是否在有
tomllib
的情况下都有效,而无需创建第二个没有
tomllib
的 venv? IE。如何人为地生成异常,以便我可以测试两个分支而不必切换到不同的版本?

python pytest
1个回答
0
投票

我不知道是否可以模拟

import
声明。但是,如果您尝试测试
try
except
内部的逻辑,我会创建两个具有逻辑的函数,从
try/except
块内部调用它们并测试它们:

from typing import Any
from importlib import metadata

def from_config():
    import tomllib
    with open("pyproject.toml", "rb") as project_file:
        pyproject: dict[str, Any] = tomllib.load(project_file)
    return pyproject["tool"]["poetry"]["version"]

def from_metadata():
    return metadata.version(__package__ or __name__)

try:
    __version__ = from_config()
except ImportError as _:
    __version__: str = from_metadata()

现在您可以分别测试

from_config
from_metadata
,无需复杂的模拟。 旁注:在
except
中使用更具体的异常,这样你就不会错过错误。

© www.soinside.com 2019 - 2024. All rights reserved.