我正在尝试使用 FlaskGroup 添加一些 Flask CLI 例程。这是我的myapi/manage.py
文件的样子:
# -*- coding: utf-8 -*-
import click
from flask import current_app as app
from flask.cli import FlaskGroup
@click.group(cls=FlaskGroup)
def cli():
"""Management interface for myproject"""
pass
@cli.command("init")
def init():
"""Run app initialization routines"""
click.echo(f"{app.name} initialized for {app.config['ENV']} environment")
入口点注册setup.py
如下(为简单起见,删除了其他 kwargs):
setup(
entry_points={
"console_scripts": [
"myapi = myapi.manage:cli",
],
},
)
我更喜欢这个项目console_scripts
,flask.commands
因为我在这个项目中使用了应用程序工厂方法,这更方便。当我运行命令时,我得到了我的预期结果:
(venv) [zobayer@hyperion myproject]$ myapi init
myproject initialized for development environment
但是,我对该init
命令的测试失败并出现异常消息,并且实际命令没有通过runner
.
这是一个测试:
def test_myapi_init(runner):
"""Test fails if `myapi init` command fails to execute"""
result = runner.invoke(args=["myapi", "init"])
print(result)
测试输出:
tests/test_cli.py <Result AttributeError("'AppGroup' object has no attribute 'cli'")>
作为参考,runner
是我在conftest.py
文件中定义的 pytest 夹具:
# -*- coding: utf-8 -*-
import pytest
from myapi.app import create_app
@pytest.fixture(scope="module")
def app():
"""A flask app with testing configurations"""
return create_app("testing")
@pytest.fixture(scope="module")
def runner(app):
"""A CLI test client to test shell commands"""
return app.test_cli_runner()
我一直在寻找有关如何为自定义脚本和 FlaskGroup cli 组编写测试的资源,但到目前为止找不到任何有希望的东西。为 cli 模块编写测试的正确方法是什么?