使用 Python 测试参数 点击
Testing argument using Python Click
我有一个命令行脚本 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() 的第一行,所以我不明白为什么会出现错误。有什么想法是错误的吗?
失败是由于以下错误。
(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 的代码:
# 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
我已将您的测试方法更改为以下内容。但是,这更像是对 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-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() 的第一行,所以我不明白为什么会出现错误。有什么想法是错误的吗?
失败是由于以下错误。
(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 的代码:
# 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
我已将您的测试方法更改为以下内容。但是,这更像是对 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
参数。