【问题标题】:How to pass pytest fixture to the main function without adding it to parameters?如何将 pytest 夹具传递给主函数而不将其添加到参数中?
【发布时间】:2021-11-10 17:07:25
【问题描述】:

在我的项目中,我有一个 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_settings 夹具传递到 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函数而不必将它添加到它的参数中?

【问题讨论】:

    标签: python pytest fixtures


    【解决方案1】:

    您的fixture 不会替换函数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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2022-10-04
      • 1970-01-01
      • 2020-06-27
      相关资源
      最近更新 更多