CliRunner没有列出在documentation中提供上下文的参数。

以下内容应作为最小的工作示例。
真正的问题有所不同。
可以通过将单击修饰的功能移至其自己的功能来进行测试覆盖来解决。然后,单击功能将几乎变得无用。

import click
from click.testing import CliRunner

class Config():
    def __init__(self):
        self.value = 651

@click.command()
@click.pass_context
def print_numberinfo(ctx):
    if not hasattr(ctx.obj, 'value'):
        ctx.obj = Config()
    click.echo(ctx.obj.value)

def test_print_numberinfo():
    ctx = click.Context(print_numberinfo, obj = Config())
    ctx.obj.value = 777
    runner = CliRunner()
    # how do I pass ctx to runner.invoke?
    result = runner.invoke(print_numberinfo)
    assert result.output == str(ctx.obj.value) + '\n'

最佳答案

您可以直接将Config实例作为关键字参数obj传递给runner.invoke:

import click
from click.testing import CliRunner

class Config():
    def __init__(self):
        self.value = 651

@click.command()
@click.pass_obj
def print_numberinfo(obj):
    if not hasattr(obj, 'value'):
        obj = Config()
    click.echo(obj.value)

def test_print_numberinfo():
    obj = Config()
    obj.value = 777
    runner = CliRunner()
    # how do I pass ctx to runner.invoke?
    result = runner.invoke(print_numberinfo, obj=obj)
    assert result.output == str(obj.value) + '\n'

08-24 22:10