使用日志记录或 return 值而不是打印来测试点击

Testing click with logging or return values instead of print

当我测试点击时,我了解到基本设置如下所示:

import click

@click.command()
@click.argument('name')
def hello(name):
   click.echo('Hello %s!' % name)

测试文件

from click.testing import CliRunner
from hello import hello

def test_hello_world():
  runner = CliRunner()
  result = runner.invoke(hello, ['Peter'])
  assert result.exit_code == 0
  assert result.output == 'Hello Peter!\n'

但是,如果我使用日志记录而不是打印,我无法捕获输出或检查命令的 return 值。例如:

import click
import logging as log

@click.command()
@click.argument('name')
def hello(name):
   log.info('Hello %s!' % name)
   return name

我无法在不打印或 click.echo 的情况下检查 return 值是否正确。

有没有一种方法可以检查 return 值或检查使用点击记录的输出?

您可以使用 pytest 中的 caplog fixture 来捕获日志输出,如下所示:

def test_hello_world(caplog):
  runner = CliRunner()
  result = runner.invoke(hello, ['Peter'])
  assert result.exit_code == 0
  assert result.output == ''
  assert caplog.messages == ['Hello Peter!']

至于要检查命令处理程序的“return”值,Click 装饰命令不会 return 常规意义上的任何内容。该命令本身使用系统 return 值,该值正在 result.exit_code.

上进行测试

如果您真的认为需要使用命令处理程序中的 return 值,您可以设置 stand_alone flag.