在我的项目的
__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。如何人为地生成异常,以便我可以测试两个分支而不必切换到不同的版本?
我不知道是否可以模拟
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
中使用更具体的异常,这样你就不会错过错误。