如何将pytest fixture传递到主函数而不将其添加到参数中



在我的项目中,我有一个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()

现在我想用fixtures返回的值来测试generate_new_token方法:

test_helpers.py

def test_generate_new_token(get_user, get_settings):
generate_new_token(user=get_user)

在这种情况下,get_settings中的TOKEN_KEY值应该是SOME_FAKE_TOKEN_KEY,但它仍然是空的。

当我调试代码时,我可以看到它将值从get_settingsfixture传递给test_generate_new_token,但随后generate_new_token调用主get_settings方法,并且不使用fixture中的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)

但是,是否可以将fixture传递给主函数,而不必将其添加到参数中?

您的fixture并没有取代函数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

请注意,您必须模拟在helpers模块中导入的get_settings的引用,请查看修补位置。

最新更新