如何将pytest夹具传递给主函数而不将其添加到参数中?
How to pass pytest fixture to the main function without adding it to parameters?
在我的项目中我有一个 Settings
class:
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
方法:
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_settings
fixture 传递给 test_generate_new_token
,但随后 generate_new_token
调用了主要的 get_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)
但是有没有办法将 fixture 传递给 main 函数而不必将其添加到其参数中?
您的装置并没有替换函数 get_settings
,它只是另一种实现。你需要做的是patch你自己的实现,例如:
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
的引用,请参阅 where to patch。
在我的项目中我有一个 Settings
class:
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
方法:
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_settings
fixture 传递给 test_generate_new_token
,但随后 generate_new_token
调用了主要的 get_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)
但是有没有办法将 fixture 传递给 main 函数而不必将其添加到其参数中?
您的装置并没有替换函数 get_settings
,它只是另一种实现。你需要做的是patch你自己的实现,例如:
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
的引用,请参阅 where to patch。