如何测试Python Click应用的多输入交互逻辑?
我之前也遇到过这个问题!CliRunner的input参数其实不接受列表,它需要的是包含换行符的字符串,每一个换行就对应一次prompt的输入。下面是解决这个问题的具体方案:
核心解决方案
当需要模拟多次输入时,把所有输入用\n连接成一个字符串传给input参数就可以了。比如先输入带空格的非法名称,再输入合法名称,就写成"my folder\nmyfolder"。
完整测试代码示例
修改你的测试函数,处理这种多输入场景:
import clicky import os from click.testing import CliRunner import pytest runner = CliRunner() # 定义各种提示文本,方便后续验证 initial_prompt = "What do you want to name the folder? (No spaces please): " error_msg = "Please enter a name with no spaces.\n" second_prompt = "What do you want to name the folder?: " success_msg = "\nYour folder has been created!\n" def test_create_folder_with_invalid_input(): with runner.isolated_filesystem(): # 模拟两次输入:先非法,再合法 test_input = "my folder\nmyfolder" result = runner.invoke(clicky.create_folder, input=test_input) # 验证文件夹确实被创建 assert "myfolder" in os.listdir() # 验证输出内容符合预期 expected_output = ( initial_prompt + "my folder\n" + error_msg + second_prompt + "myfolder\n" + success_msg ) assert result.output == expected_output
为什么之前用列表会报错?
CliRunner的input参数底层会把输入内容编码成字节流,所以它只接受字符串类型。如果你传列表,Python会尝试调用list.encode(),但列表没有这个方法,就会抛出'list' object has no attribute 'encode'的错误。用换行分隔的字符串就能完美解决这个问题。
扩展:处理更多次输入
如果你的逻辑需要更多次输入(比如用户连续输入多个非法值),只需要继续在字符串里加换行就行。比如:
# 模拟三次输入:带空格→已存在→合法 test_input = "my folder\nexisting_folder\nnew_valid_folder"
这样就能覆盖更复杂的用户交互场景啦!
内容的提问来源于stack exchange,提问作者tiggerae
相关产品推荐
相关产品推荐

