在Typer/Click命令(Python)中修补模拟调用的位置
我的代码是用打字机, 但我认为点击也是如此。 在命令内部正确修补sys.stdout.isatty调用时遇到问题。 如果我直接测试函数(在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
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"