首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python Click测试参数

使用Python Click测试参数
EN

Stack Overflow用户
提问于 2020-05-31 06:24:21
回答 2查看 1.5K关注 0票数 5

我有一个带有Python-click的命令行脚本,带有一个参数和选项:

代码语言:javascript
复制
# console.py
import click

@click.command()
@click.version_option()
@click.argument("filepath", type=click.Path(exists=True), default=".")
@click.option(
    "-m",
    "--max-size",
    type=int,
    help="Max size in megabytes.",
    default=20,
    show_default=True,
)
def main(filepath: str, max_size: int) -> None:
    max_size_bytes = max_size * 1024 * 1024  # convert to MB
    if filepath.endswith(".pdf"):
        print("success")
    else:
        print(max_size_bytes)

参数和选项都有默认值,并在命令行上工作,使用CLI时,它的行为与预期一样。但是当我尝试测试它时,单击documentation并调试它,它没有输入第一行:

代码语言:javascript
复制
# test_console.py
from unittest.mock import Mock

import click.testing
import pytest
from pytest_mock import MockFixture

from pdf_split_tool import console

@pytest.fixture
def runner() -> click.testing.CliRunner:
    """Fixture for invoking command-line interfaces."""
    return click.testing.CliRunner()

@pytest.fixture
def mock_pdf_splitter_pdfsplitter(mocker: MockFixture) -> Mock:
    """Fixture for mocking pdf_splitter.PdfSplitter."""
    return mocker.patch("pdf_split_tool.pdf_splitter.PdfSplitter", autospec=True)

def test_main_uses_specified_filepath(
    runner: click.testing.CliRunner,
    mock_pdf_splitter_pdfsplitter: Mock, 
) -> None:
    """It uses the specified filepath."""
    result = runner.invoke(console.main, ["test.pdf"])
    assert result.exit_code == 0

因为调试器没有进入main()函数的第一行,所以我不明白它为什么会给出。有什么想法可能是错误的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-03 00:43:29

失败是由于以下错误造成的。

代码语言:javascript
复制
(pdb)print result.output
"Usage: main [OPTIONS] [FILEPATH]\nTry 'main --help' for help.\n\nError: Invalid value for '[FILEPATH]': Path 'test.pdf' does not exist.\n"

这是由于console.py中检查文件路径是否存在的以下代码造成的。@click.argument("filepath", type=click.Path(exists=True), default=".")

测试创建临时文件的一种方法是使用afterburner的代码:

代码语言:javascript
复制
# test_console.py
def test_main_uses_specified_filepath() -> None:
    runner = click.testing.CliRunner()
    with runner.isolated_filesystem():
        with open('test.pdf', 'w') as f:
            f.write('Hello World!')

        result = runner.invoke(main, ["test.pdf"])
    assert result.exit_code == 0
票数 5
EN

Stack Overflow用户

发布于 2020-06-03 02:10:06

我已经将您的测试方法更改为以下内容。然而,这更多的是对apoorva kamath的回答的补充。

代码语言:javascript
复制
def test_main_uses_specified_filepath() -> None:
    runner = click.testing.CliRunner()
    with runner.isolated_filesystem():
        with open('test.pdf', 'w') as f:
            f.write('Hello World!')

        result = runner.invoke(main, ["test.pdf"])
    assert result.exit_code == 0

简单地说,它创建了一个独立的文件系统,在文本执行后将被清除。因此,在那里创建的任何文件都将随其一起销毁。

要了解更多信息,Click's Isolated Filesystem documentation可能会派上用场。

或者,您可以删除文件路径的exists=True参数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62109364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档