11

CliRunner没有列出任何参数以在其文档中提供上下文。

以下应符合最低限度的工作示例。真正的问题有点不同。可以通过将 click 修饰函数移动到其自己的函数中以进行测试覆盖来解决此问题。然后单击功能将变得几乎无用。

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'
4

2 回答 2

6

您可以直接将您的Config实例作为关键字参数传递objrunner.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'
于 2016-11-05T21:46:32.920 回答
0

对于只想context.obj从命令行进行调用的人:

CliRunner().invoke(commands.cli, ['sayhello'], catch_exceptions=False)

第一个参数应该是点击的根组,然后您可以将您要调用的命令传递给第二个参数(即sayhello)。


怎么commands.py样:

# !/usr/bin/env python
# coding: utf-8
import click


@click.group()
@click.pass_context
def cli(ctx):
    ctx.obj = {
        'foo': 'bar'
    }


@cli.command()
@click.pass_context
def sayehello(ctx):
    click.echo('hello!' + ctx.obj)


感谢geowurster提供的解决方案。

于 2020-12-04T03:09:40.053 回答