python - 如何将 pytest 夹具传递给主函数而不将其添加到参数中?
问题描述
在我的项目中,我有一Settings
堂课:
config.py
class Settings(BaseSettings):
DEBUG: bool = os.getenv("DEBUG", 'False')
TOKEN_KEY: str = os.getenv("TOKEN_KEY", '')
TOKEN_PASSWORD: str = os.getenv("TOKEN_PASSWORD", '')
@lru_cache()
def get_settings():
return Settings()
我以这样的方法使用它:
helpers.py
def generate_new_token(user: User) -> str:
settings = get_settings()
private_key = settings.TOKEN_KEY
token_password = settings.TOKEN_PASSWORD
# Do something
我创建了这两个装置:
conftest.py
@pytest.fixture
def get_settings():
return Settings(DEBUG=True, TOKEN_KEY="SOME_FAKE_TOKEN_KEY", TOKEN_PASSWORD='')
@pytest.fixture
def get_user():
return User()
现在我想generate_new_token
用从fixtures返回的值来测试这个方法:
test_helpers.py
def test_generate_new_token(get_user, get_settings):
generate_new_token(user=get_user)
在这种情况下,TOKEN_KEY
from 的值get_settings
应该是SOME_FAKE_TOKEN_KEY
,但它仍然是空的。
当我调试代码时,我可以看到它将值从get_settings
夹具传递到test_generate_new_token
,但随后generate_new_token
调用 mainget_settings
方法并且不使用夹具中的值get_settings
作为settings
值。
我知道如果我settings
作为参数传递给generate_new_token
这样的:
def generate_new_token(user: DexterUser, settings: Settings) -> str:
然后我可以将夹具从测试功能传递给它:
def test_generate_new_token(get_user, get_settings):
generate_new_token(user=get_user, settings=get_settings)
但是无论如何都可以将夹具传递给主函数而不必将其添加到其参数中?
解决方案
您的夹具不会替换功能get_settings
,它只是另一种实现。你需要做的是用你自己的补丁实现,例如:
conftest.py
from unittest import mock
import pytest
@pytest.fixture
def get_settings():
with mock.patch("your_module.helpers.get_settings") as mocked_settings:
mocked_settings.return_value = Settings(
DEBUG=True,
TOKEN_KEY="SOME_FAKE_TOKEN_KEY",
TOKEN_PASSWORD='')
yield
请注意,您必须模拟在您的模块get_settings
中导入的引用,请参阅在哪里修补.helpers
推荐阅读
- c - ld:最终链接失败:构建 Linux 内核 5.8.9 时内存耗尽
- windows - Electron:在 macOS 和 Windows 之间共享相同的项目文件夹
- c# - 异步客户端套接字 C#。如何在不阻塞程序运行的情况下循环等待来自服务器的信息?
- java - 未在 xml ResourceNotFoundException 中加载矢量可绘制对象
- bash - 在 awk 中获取多个压缩文件的 FILENAME
- angular - Angular 7服务器端渲染同时服务:ssr
- javascript - Nest.js Jest 不能模拟测试应用,但可以模拟测试控制器
- html - 转换:translateY() 在 Safari 中不起作用
- reactjs - 使用谷歌地图地理定位 api 进行准确的地理定位
- java - 杰克逊 json 到 java 映射 + 切割 json 内部对象