【问题标题】:Pytest: How do I change ~/.bashrc token durning runtime?Pytest:如何在运行时更改 ~/.bashrc 令牌?
【发布时间】:2022-01-07 12:04:36
【问题描述】:

我想在我的 bashrc 中动态更改令牌以断言预期的结果。

例如:在我的 ~/.bashrc 我有我的令牌集

export GITHUB_ACCESS_TOKEN=ghp_NNNNNNNNNNNN

在测试期间我想设置令牌

export GITHUB_ACCESS_TOKEN=TEST

然后断言通过运行单击命令来检查我是否无法访问我的存储库:

result = runner.invoke(clicker_cli, ["git", "clone", "<url_here>"])

它没有按预期工作。我仍然可以使用我的原始令牌访问我的仓库。

上下文: 我正在使用https://click.palletsprojects.com/en/8.0.x/ https://docs.pytest.org/en/6.2.x/monkeypatch.html

【问题讨论】:

    标签: python click pytest monkeypatching


    【解决方案1】:

    您可以设置将在运行时使用的可选env 字典 (Mapping)。查看invokedocumentation 了解详情。所以下面的代码就可以解决问题。

    result = runner.invoke(
       clicker_cli, ["git", "clone", "<url_here>"], 
       env={"GITHUB_ACCESS_TOKEN": "TEST"}
    )
    

    完整示例

    这是一个完整的工作示例。

    import click
    import os
    from click.testing import CliRunner
    
    
    @click.command()
    @click.argument("msg")
    def echo_token(msg):
        click.echo(f"{msg} {os.environ.get('GITHUB_ACCESS_TOKEN')}")
    
    
    def test_echo_token(token="MY_TOKEN"):
        runner = CliRunner()
        result = runner.invoke(echo_token, ["Token is"],
                 env={"GITHUB_ACCESS_TOKEN": token})
        assert result.exit_code == 0
        assert token in result.output
        print(result.output)
    

    运行我们可以看到环境变量设置正确。

    pytest -s click_test.py
    # click_test.py Token is MY_TOKEN
    

    【讨论】:

    • 它仍然使用我的旧令牌,因为它在我的 bashrc 中。我正在研究这个,我想看看这是否有效:stackoverflow.com/questions/27553576/…
    • 感谢您的澄清。我确实尝试过使用它,但它把我的令牌“设置”为我的旧令牌
    • 阅读您提供的文档:您能帮我理解 runner.isolation 吗?我认为这可能对我有帮助
    • @ChristheCow 根据文档这是在invoke() 方法中自动完成的。所以这不是您正在寻找的解决方案。 IMO 这取决于您在方法中所做的事情。如果您从 Python 代码调用 shell,它可能会获取 .bashrc 并覆盖变量。
    • 我明白了。我将不得不更深入地了解它实际上在做什么。我将需要检查调用源是否为 bashrc。您的解决方案确实有效。谢谢你。我现在只是好奇它为什么会覆盖。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多