gpt4 book ai didi

python - 使用 Python Click 测试参数

转载 作者:行者123 更新时间:2023-12-03 20:06:03 26 4
gpt4 key购买 nike

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

# 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 对其进行测试时并调试它,它不进入第一行:

# 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() 的第一行。任何可能出问题的想法?

最佳答案

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


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参数到您的文件路径。

关于python - 使用 Python Click 测试参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62109364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com