为什么 CliRunner().invoke(...) 对象的“return_value”为空?

tat*_*nji 4 python command-line-interface pytest python-click

我正在使用 click v8.1.3 并尝试创建一些 pytests,但return_value在使用时没有达到我的预期click.testing.CliRunner().invoke

import click.testing
import mycli

def test_return_ctx():
  @mycli.cli.command()
  def foo():
    return "Potato"
  
  runner = click.testing.CliRunner()
  result = runner.invoke(mycli.cli, ["foo"])

  assert result.return_value == "Potato" # this fails. b/c the actual value is None
Run Code Online (Sandbox Code Playgroud)

我尝试更新 root 命令以返回一些随机值,看看我们是否在那里得到一个值

# mycli
import click

@click.group()
def cli():
  return "Potato"
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。return_value因为Result物体仍然是None

我是否误解了如何从命令返回值?

https://click.palletsprojects.com/en/8.1.x/api/#click.testing.Result.return_value

Ste*_*uch 5

单击命令处理程序不会返回值,除非您使用:standalone_mode=False。您可以在测试期间执行此操作,例如:

result = CliRunner().invoke(foo, standalone_mode=False)
Run Code Online (Sandbox Code Playgroud)

测试代码:

import click
from click.testing import CliRunner


def test_return_value():
    @click.command()
    def foo():
        return "bar"

    result = CliRunner().invoke(foo, standalone_mode=False)

    assert result.return_value == "bar"
Run Code Online (Sandbox Code Playgroud)

检测结果:

============================= test session starts ============================
collecting ... collected 1 item

test_code.py::test_return_value PASSED                                   [100%]

============================== 1 passed in 0.03s ==============================
Run Code Online (Sandbox Code Playgroud)