如何为使用structopt构建的Rust CLI工具编写测试
为基于StructOpt的Rust CLI工具编写测试
我用StructOpt构建了一个小型Rust CLI工具,想要给它添加测试,但没找到可用的文档或示例。
工具核心代码
use structopt::StructOpt; #[derive(Debug, StructOpt)] #[structopt(name = "example")] struct Cli { domain: String, } fn main() -> Result<(), Box<dyn std::error::Error>> { let args = Cli::from_args(); let url = format!("https://example.com/{}", args.domain); let resp = ureq::get(&url.to_string()).call().into_json()?; println!("Has data for domain: {}", args.domain); Ok(()) }
最初的测试设想
我原本想写出类似这样的测试代码:
#[cfg(test)] mod tests { use super::*; #[test] fn valid_domain() { // 设想中的调用方式 let cli = Cli::build_command(domain: "google.com"); let output = cli.run_command(); assert!(output.contains("Has data")); } }
最终解决方案:使用assert_cmd crate
后来我用assert_cmd crate解决了问题,以下是部分测试代码:
mod tests { use assert_cmd::Command; #[test] fn valid_domain() { let mut cmd = Command::cargo_bin("example").unwrap(); let output = cmd.arg("google.com").unwrap(); let output_str = String::from_utf8(output.stdout).unwrap(); assert!(output_str.contains("Has data")); } #[test] #[should_panic(expected = "Invalid domain")] fn invalid_domain() { Command::cargo_bin("example").unwrap().arg("google").unwrap(); } }
内容的提问来源于stack exchange,提问作者Thong Nguyen
相关产品推荐
相关产品推荐

