在我的项目的__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__)

这段代码在Python3.11及更高版本上运行良好.然而,在较早的版本中,tomllib不存在,因此应该引发异常(版本将通过使用metadata来确定)

当在带有pytest的Python3.11上进行测试时,有没有办法设计一个测试来判断这种确定版本的方法在有tomllib和没有tomllib的情况下是否都有效,而不必创建没有tomllib的第二个venv?也就是说,我如何人为地生成异常,以便我可以测试两个分支,而不必切换到不同的版本?

推荐答案

你可以打sys.modules,所以tomllib不在那里(见Python testing: Simulate ImportError)

以下是一个经过精心策划的例子:

import sys


def func():
    try:
        import tomllib

        return 1
    except ImportError:
        return 0


def test_with_tomllib():
    assert func() == 1


def test_without_tomllib(monkeypatch):
    monkeypatch.setitem(sys.modules, 'tomllib', None)
    assert func() == 0

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

如何避免Chained when/then分配中的Mypy不兼容类型警告?

将两只Pandas rame乘以指数

管道冻结和管道卸载

Python键入协议默认值

如何将一个动态分配的C数组转换为Numpy数组,并在C扩展模块中返回给Python

为什么抓取的HTML与浏览器判断的元素不同?

关于Python异步编程的问题和使用await/await def关键字

Pandas—在数据透视表中占总数的百分比

使用NeuralProphet绘制置信区间时出错

dask无groupby(ddf. agg([min,max])?''''

OpenCV轮廓.很难找到给定图像的所需轮廓

如何在海上配对图中使某些标记周围的黑色边框

为什么我的sundaram筛这么低效

numpy数组和数组标量之间的不同行为

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

如何在Python中画一个只能在对角线内裁剪的圆?

try 使用RegEx解析由标识多行文本数据的3行头组成的日志(log)文件

使用Django标签显示信息