如何在Rust的clap库中模拟用户输入以编写测试?
用Clap模拟用户输入编写Rust CLI测试的方法
直接构造命令行参数数组
Clap的Command提供了get_matches_from方法,无需依赖真实命令行环境,直接传入字符串数组就能模拟用户输入的命令行参数。示例代码:use clap::Command; #[test] fn test_cli_command() { // 模拟用户输入:my_cli --input file.txt --verbose let args = ["my_cli", "--input", "file.txt", "--verbose"]; let matches = Command::new("my_cli") .arg(clap::Arg::new("input").short('i').long("input").required(true)) .arg(clap::Arg::new("verbose").short('v').long("verbose")) .get_matches_from(args); // 验证参数解析结果 assert_eq!(matches.get_one::<String>("input").unwrap(), "file.txt"); assert!(matches.get_flag("verbose")); }用
assert_matches宏简化断言
配合clap::assert_matches宏能快速验证解析结果是否符合预期,减少重复代码:use clap::{Command, Arg, assert_matches}; #[test] fn test_cli_with_assert_matches() { let args = ["my_cli", "-i", "test.csv"]; let cmd = Command::new("my_cli") .arg(Arg::new("input").short('i').long("input").required(true)); assert_matches!(cmd.get_matches_from(args), matches => { assert_eq!(matches.get_one::<String>("input").unwrap(), "test.csv"); }); }模拟错误输入场景
测试非法输入时,可断言get_matches_from返回错误,比如缺少必填参数的情况:use clap::{Command, Arg, ErrorKind}; #[test] fn test_missing_required_arg() { let args = ["my_cli"]; let cmd = Command::new("my_cli") .arg(Arg::new("input").short('i').long("input").required(true)); let result = cmd.try_get_matches_from(args); assert!(result.is_err()); assert_eq!(result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); }处理子命令的模拟
如果CLI包含子命令,直接在参数数组中加入子命令名称即可:use clap::{Command, Arg}; #[test] fn test_subcommand() { let args = ["my_cli", "download", "--url", "https://example.com"]; let cmd = Command::new("my_cli") .subcommand(Command::new("download") .arg(Arg::new("url").short('u').long("url").required(true))); let matches = cmd.get_matches_from(args); let (subcmd_name, sub_matches) = matches.subcommand().unwrap(); assert_eq!(subcmd_name, "download"); assert_eq!(sub_matches.get_one::<String>("url").unwrap(), "https://example.com"); }
内容的提问来源于stack exchange,提问作者KamiWar
相关产品推荐
相关产品推荐

