Python 如何测试需要文件的单击命令

Python 如何测试需要文件的单击命令,python,pytest,python-click,Python,Pytest,Python Click,我有一个单击命令,可以对文件执行某些操作: 导入单击 @click.command()命令 @click.argument(“文件”,type=click.file(“r”)) def foo(文件): 打印(file.read()) 我想在不创建临时文件的情况下对其进行测试,但我不知道给运行程序提供哪条路径,也无法在web上找到示例。像这样的东西会很好: 从click.testing导入CliRunner 从magic_lib导入magic_文件 def test_foo(): runner

我有一个单击命令,可以对文件执行某些操作:

导入单击
@click.command()命令
@click.argument(“文件”,type=click.file(“r”))
def foo(文件):
打印(file.read())
我想在不创建临时文件的情况下对其进行测试,但我不知道给运行程序提供哪条路径,也无法在web上找到示例。像这样的东西会很好:

从click.testing导入CliRunner
从magic_lib导入magic_文件
def test_foo():
runner=CliRunner()
假文件=魔术文件(“你好,世界!”)
结果=runner.invoke(foo,[fake_file.location])
assert result.output==“你好,世界!\n”
我可以通过任何方式使
单击.File
了解我希望它查看的位置吗?

您可以使用。这取决于您的测试框架;它最容易与一起使用,因为它自动提供
fs
夹具:

def test_foo(fs):
    fake_file = fs.create_file('/foo/bar', contents="Hello, world!")

    runner = CliRunner()
    result = runner.invoke(foo, [fake_file.path])
    assert result.output == "Hello, world!\n"

注:由于
foo
中的
print
添加了一个换行符,因此必须在文件末尾创建文件,而不使用
\n
,测试才能正常工作。

“pyfakefs会自动向文件添加一个换行符”我认为这是来自于单击函数,因为它调用了
print
。有趣的是,我刚刚找到了一个使用
click
自己的测试对象的示例解决方案,但您的测试对象更加精简,允许我重新使用调用夹具,所以我不会费心写一个以该对象为特征的答案。@Arne我想您应该重新考虑它。在我看来,最佳的解决方案是使用
隔离的文件系统
@FcknGioconda为什么您认为单击更好?就我所见,pyfakefs也做同样的事情,但一旦我学会了,我也可以在我所有其他不使用单击的项目中使用它。