使用Python单击测试参数

使用Python单击测试参数,python,python-3.x,unit-testing,testing,python-click,Python,Python 3.x,Unit Testing,Testing,Python Click,我有一个带Python的命令行脚本,单击带有参数和选项: #console.py 导入点击 @click.command()命令 @单击.version_option() @click.argument(“filepath”,type=click.Path(exists=True),default=“.”) @单击。选项( “-m”, “--最大大小”, 类型=int, help=“以兆字节为单位的最大大小。”, 默认值=20, show_default=True, ) def main(文件路

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

#console.py
导入点击
@click.command()命令
@单击.version_option()
@click.argument(“filepath”,type=click.Path(exists=True),default=“.”)
@单击。选项(
“-m”,
“--最大大小”,
类型=int,
help=“以兆字节为单位的最大大小。”,
默认值=20,
show_default=True,
)
def main(文件路径:str,最大大小:int)->无:
max_size_bytes=max_size*1024*1024#转换为MB
如果filepath.endswith(“.pdf”):
打印(“成功”)
其他:
打印(最大大小字节)
参数和选项都有默认值,在命令行上工作,并使用CLI,其行为符合预期。但当我尝试在单击并调试后测试它时,它不会进入第一行:

#test_console.py
从unittest.mock导入mock
导入点击测试
导入pytest
从pytest_mock导入MockFixture
从pdf_分割工具导入控制台
@pytest.fixture
def runner()->单击.testing.CliRunner:
“”“用于调用命令行接口的设备。”“”
返回click.testing.CliRunner()
@pytest.fixture
def mock_pdf_splitter_pdfsplitter(mocker:MockFixture)->mock:
“”“模拟pdf_拆分器的夹具。PdfSplitter。”“”
返回mocker.patch(“pdf\u split\u tool.pdf\u splitter.PdfSplitter”,autospec=True)
def test_main_使用_指定的文件路径(
runner:单击.testing.CliRunner,
mock_pdf_splitter_pdfsplitter:mock,
)->无:
“”“它使用指定的文件路径。”“”
结果=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=“.”

测试创建临时文件的一种方法是使用加力燃烧室代码:

#test_console.py
def test_main_使用_指定的_filepath()->无:
runner=单击.testing.CliRunner()
使用runner.isolated_filesystem():
以open('test.pdf','w')作为f:
f、 写下(“你好,世界!”)
result=runner.invoke(main,[“test.pdf”])
assert result.exit_code==0

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


def test_main_使用_指定的_filepath()->无:
runner=单击.testing.CliRunner()
使用runner.isolated_filesystem():
以open('test.pdf','w')作为f:
f、 写下(“你好,世界!”)
result=runner.invoke(main,[“test.pdf”])
assert result.exit_code==0
简单地说,它创建了一个独立的文件系统,在执行文本后将其清理干净。因此,在那里创建的任何文件都会随之销毁

有关更多信息,请参阅


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

谢谢@afterburner。我认为答案是你两个答案的结合。由于apoorva kamath首先回答了问题,我会给她正确的答案(并投你一票)。@staticdev感谢,我同意,她认为这只是一个小小的改进,
因为f
f.write
不需要工作。您可以将invoke替换为
f.write
=真的。我不确定如果Python没有写入任何内容,它是否会创建一个空文件,但今天我学到了:DThanks apoorva kamath!我怎样才能看到这个错误?加力刚刚发布了一个测试代码,作为对您答案的补充。如果你能用代码完成你的答案(因为赏金指定了它需要的代码),我将标记为正确答案。我已经使用
click
的测试包一段时间了,但它给我带来了错误和悲伤,我转而自己调用我的入口点。你可能也想这么做