2016-11-05 72 views
3

CliRunner列出了没有参数在其documentation中提供上下文。如何将ctx(上下文)传递给CliRunner?

以下内容应被视为最低工作示例。 真正的问题有点不同。 可以通过将点击装饰功能移动到其自己的功能来解决测试覆盖问题。然后,点击功能将变得几乎无用。

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' 

回答

2

您将直接通过您的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'