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

How to test click commands that expect files

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

import click

@click.command()
@click.argument("file", type=click.File("r"))
def foo(file):
    print(file.read())

而且我想在不创建临时文件的情况下对其进行测试,但我不知道该给运行器提供哪条路径,也无法在网上找到示例。这样的东西会很好:

from click.testing import CliRunner

from magic_lib import magic_file

def test_foo():
    runner = CliRunner()
    fake_file = magic_file("Hello, world!")
    result = runner.invoke(foo, [fake_file.location])
    assert result.output == "Hello, world!\n"

有什么方法可以让 click.File 了解我希望它显示的位置?

您可以使用 pyfakefs. The usage depends on your testing framework; it's easiest to use with pytest 因为它会自动提供一个 fs fixture:

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"

P.S.: 因为 foo 中的 print 添加了一个换行符,所以必须在末尾创建没有 \n 的文件才能进行测试。