0

我正在尝试使用 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_scriptsflask.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 模块编写测试的正确方法是什么?

4

0 回答 0