在Typer/Click命令(Python)中修补模拟调用的位置

在Typer/Click命令(Python)中修补模拟调用的位置,python,python-3.x,python-mock,python-click,typer,Python,Python 3.x,Python Mock,Python Click,Typer,我的代码是用打字机, 但我认为点击也是如此。 在命令内部正确修补sys.stdout.isatty调用时遇到问题。 如果我直接测试函数(I\u fail),我可以成功模拟, 但是当通过Typer(可能还有Click)调用CliRunner时,我无法修补isatty。 如果我尝试修补“\uuuu main\uuu.sys.stdout.isatty”或“sys.stdout.isatty”,也会发生同样的情况 我可以强制它工作的一种方法是从使用import sys和sys.stdout.isatt

我的代码是用打字机, 但我认为点击也是如此。 在命令内部正确修补sys.stdout.isatty调用时遇到问题。 如果我直接测试函数(
I\u fail
),我可以成功模拟, 但是当通过Typer(可能还有Click)调用CliRunner时,我无法修补
isatty
。 如果我尝试修补
“\uuuu main\uuu.sys.stdout.isatty”
“sys.stdout.isatty”
,也会发生同样的情况

我可以强制它工作的一种方法是从使用
import sys
sys.stdout.isatty
从sys import stdout和
stdout.isatty导入

但我更想知道:

  • 我要在哪里正确地进行修补,以使sys.stdout.isatty
  • mock按预期工作
  • 这里出了什么问题
  • 我在下面建立了一个示例项目,其中有一个失败的测试和一个成功的测试。 我在测试套件中同时使用pytest和pytest mock

    .
    ├── src
    │   └── package
    │       ├── __init__.py
    │       └── __main__.py
    └── tests
        └── test_main.py
    
    “”“\uuuuu main\uuuuuu.py”“”
    导入系统
    从系统导入标准输出
    进口打字机
    app=typer.typer()
    @app.command()
    def i_fail():
    “”“测试时失败。”“”
    打印(sys.stdout.isatty())
    @app.command()
    定义i_pass():
    “”“测试时通过测试。”“”
    打印(stdout.isatty())
    如果名称=“\uuuuu main\uuuuuuuu”:
    app()
    
    """test_main.py"""
    from typer import testing
    
    from package.__main__ import app
    
    
    def test_i_fail(mocker):
        """This test fails."""
        runner = testing.CliRunner()
        mock = mocker.patch("package.__main__.sys.stdout.isatty")
        mock.return_value = "successfully mocked"
        assert runner.invoke(app, args=["i-fail"]).output == "successfully mocked"
    
    
    def test_i_pass(mocker):
        """This test passes."""
        runer = testing.CliRunner()
        mock = mocker.patch("package.__main__.sys.stdout.isatty")
        mock.return_value = "successfully mocked"
        assert runner.invoke(app, args=["i-pass"]).output == "successfully mocked"