在runner.isolated_filesystem()中使用click.Path选项无法读取文件
问题解决:Click CLI测试中文件路径找不到的问题
问题原因
你的测试代码中,给runner.invoke传递参数的方式错误:将选项-f和文件名合并成了单个列表元素[f"-f {file_name}"],导致Click解析参数时,把包含空格的整个字符串当作-f的参数值,最终得到的路径前面带有空格(从报错信息Path ' validations_spec.json' does not exist的空格可看出),自然找不到文件。
解决方案
有两种修正方式,任选其一即可:
方式一:拆分选项与路径为独立列表元素
把-f和文件名拆成列表的两个元素,让CliRunner正确解析每个参数:
def test_validate(validations_spec): runner = CliRunner() with runner.isolated_filesystem() as td: file_name = "validations_spec.json" write_validations_spec_to_local_file(validations_spec, Path(file_name)) result = runner.invoke( validate, ["-f", file_name], # 拆分选项和值为独立列表元素 ) processed_validations_spec = validations_spec.process(MirrorExecutor()) assert result.output.strip() == str(processed_validations_spec) # 建议strip处理输出换行符
方式二:直接传递参数字符串而非列表
如果想保持选项和值的连贯写法,可以直接传递一个字符串给args参数,CliRunner会自动帮你拆分参数:
def test_validate(validations_spec): runner = CliRunner() with runner.isolated_filesystem() as td: file_name = "validations_spec.json" write_validations_spec_to_local_file(validations_spec, Path(file_name)) result = runner.invoke( validate, f"-f {file_name}", # 直接传递完整参数字符串 ) processed_validations_spec = validations_spec.process(MirrorExecutor()) assert result.output.strip() == str(processed_validations_spec)
额外说明
CliRunner的invoke方法中,args参数支持两种格式:
- 字符串:会自动按空格拆分成命令行参数列表
- 列表:每个元素对应一个独立的命令行参数(选项、参数需分别作为元素)
你之前的错误在于用了列表格式,但把两个参数合并成了一个元素,导致解析异常。
内容的提问来源于stack exchange,提问作者user23706137
相关产品推荐
相关产品推荐

