如何在我的测试套件中使用 click 只获得 commands/subcommands 的列表?
How do I get just a list of commands/subcommands using click in my test suite?
我构建了一个使用分组命令和子命令的 CLI 应用程序。一切正常。但是,我想确保这种情况在未来继续存在,所以我想确保我的所有命令和子命令都已正确加载。
我首先想到的是 运行
commands = ["config", "othercommand"]
runner = CliRunner()
result = runner.invoke(cli.main)
for command in commands:
assert command in result.output
从我的角度来看,这有一些缺陷。
- 它要求我在每次添加新的时更新
commands
。我希望能够自动生成它。
- 如果我有一个命令是一个相对常见的单词,会出现在帮助测试中(即
config
),我可能会得到错误的结果。
- 我不知道如何以优雅的方式处理其中每一个的子命令。
我的申请是这样布局的:
@click.group()
def main():
"""My entry point"""
@click.group()
def config():
"""config group"""
@config.command()
def add_config():
"""this is a subcommand to config"""
@click.group()
def othercommand():
"""othercommand group"""
@othercommand.command()
def do_thing():
"""this is a subcommand to othercommand"""
我的问题:有没有办法获取我可以使用的所有命令(和子命令)的列表,并从我的测试套件中执行此操作?最好没有周围的一切帮助测试,这样我就可以消除错误的结果。
可以内省 cli 以获取其结构,如:
代码:
def command_tree(obj):
if isinstance(obj, click.Group):
return {name: command_tree(value)
for name, value in obj.commands.items()}
测试代码:
import click
@click.group()
def main():
"""My entry point"""
@main.group()
def config():
"""config group"""
@config.command()
def add_config():
"""this is a subcommand to config"""
@main.group()
def othercommand():
"""othercommand group"""
@othercommand.command()
def do_thing():
"""this is a subcommand to othercommand"""
print(command_tree(main))
结果:
{'config': {'add_config': None}, 'othercommand': {'do_thing': None}}
我构建了一个使用分组命令和子命令的 CLI 应用程序。一切正常。但是,我想确保这种情况在未来继续存在,所以我想确保我的所有命令和子命令都已正确加载。
我首先想到的是 运行
commands = ["config", "othercommand"]
runner = CliRunner()
result = runner.invoke(cli.main)
for command in commands:
assert command in result.output
从我的角度来看,这有一些缺陷。
- 它要求我在每次添加新的时更新
commands
。我希望能够自动生成它。 - 如果我有一个命令是一个相对常见的单词,会出现在帮助测试中(即
config
),我可能会得到错误的结果。 - 我不知道如何以优雅的方式处理其中每一个的子命令。
我的申请是这样布局的:
@click.group()
def main():
"""My entry point"""
@click.group()
def config():
"""config group"""
@config.command()
def add_config():
"""this is a subcommand to config"""
@click.group()
def othercommand():
"""othercommand group"""
@othercommand.command()
def do_thing():
"""this is a subcommand to othercommand"""
我的问题:有没有办法获取我可以使用的所有命令(和子命令)的列表,并从我的测试套件中执行此操作?最好没有周围的一切帮助测试,这样我就可以消除错误的结果。
可以内省 cli 以获取其结构,如:
代码:
def command_tree(obj):
if isinstance(obj, click.Group):
return {name: command_tree(value)
for name, value in obj.commands.items()}
测试代码:
import click
@click.group()
def main():
"""My entry point"""
@main.group()
def config():
"""config group"""
@config.command()
def add_config():
"""this is a subcommand to config"""
@main.group()
def othercommand():
"""othercommand group"""
@othercommand.command()
def do_thing():
"""this is a subcommand to othercommand"""
print(command_tree(main))
结果:
{'config': {'add_config': None}, 'othercommand': {'do_thing': None}}