如何将 ctx(上下文)传递给 CliRunner?
How can I pass a ctx (Context) to CliRunner?
CliRunner
未列出在其 documentation 中提供上下文的参数。
以下应符合最低工作示例的条件。
真正的问题有点不同。
可以通过将 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'
您可以直接将 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'
对于只想让 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 提供解决方案。
CliRunner
未列出在其 documentation 中提供上下文的参数。
以下应符合最低工作示例的条件。 真正的问题有点不同。 可以通过将 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'
您可以直接将 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'
对于只想让 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 提供解决方案。