You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不新增入参即可将pytest fixture值传入主函数?

解决方案

你不需要修改原业务函数的参数,通过修补(Mock)业务代码中调用的get_settings函数即可实现需求。核心原因是你之前定义的fixture仅作为测试函数的入参存在,和helpers.py中实际调用的config.get_settings是完全独立的两个对象,只要替换业务代码实际调用的get_settings返回值即可。

方案1:使用pytest内置monkeypatch fixture(推荐)

因为原get_settings加了@lru_cache装饰器,需要先清空缓存避免旧值影响。
首先修改conftest.py的fixture:

import pytest
from config import get_settings as real_get_settings, Settings

@pytest.fixture
def mock_settings(monkeypatch):
    # 清空原有缓存
    real_get_settings.cache_clear()
    # 构造测试用配置
    test_settings = Settings(
        DEBUG=True,
        TOKEN_KEY="SOME_FAKE_TOKEN_KEY",
        TOKEN_PASSWORD=''
    )
    # 替换全局的get_settings实现
    monkeypatch.setattr("config.get_settings", lambda: test_settings)
    yield test_settings
    # 测试结束后清空缓存,避免影响其他用例
    real_get_settings.cache_clear()

之后测试用例直接使用即可,无需修改原业务代码:

def test_generate_new_token(get_user, mock_settings):
    # 此时generate_new_token内部调用的get_settings会自动返回mock的配置
    token = generate_new_token(user=get_user)
    # 后续断言逻辑

方案2:使用unittest.mock.patch临时修补

如果不想修改fixture,也可以在单个测试用例中临时修补:

from unittest.mock import patch
from config import Settings, get_settings

def test_generate_new_token(get_user):
    # 清空缓存
    get_settings.cache_clear()
    test_settings = Settings(DEBUG=True, TOKEN_KEY="SOME_FAKE_TOKEN_KEY", TOKEN_PASSWORD='')
    # 修补helpers模块中引用的get_settings函数
    with patch("helpers.get_settings", return_value=test_settings):
        token = generate_new_token(user=get_user)
        # 后续断言逻辑

注意事项:如果原get_settings已经在测试运行前被调用过并生成了缓存,必须先调用get_settings.cache_clear()清空缓存,否则修补后的函数不会生效。patch的路径需要和业务代码中实际引用get_settings的路径一致,才能正确替换。

内容的提问来源于stack exchange,提问作者Ghasem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:06:03