如何不新增入参即可将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
相关产品推荐
相关产品推荐

