跟随《Command-Line Rust》编写的Rust测试触发Panic失败求助
问题:《Command-Line Rust》中
ls命令测试失败的原因? 我最近学习Ken Youens-Clark所著的《Command-Line Rust》,在第8页作者讲解Rust单元测试时给出如下测试示例代码:
use std::process::Command; #[test] fn runs() { let mut cmd = Command::new("ls"); let res = cmd.output(); assert!(res.is_ok()); }
按照作者要求运行cargo test应得到测试通过结果,但我运行时测试失败,报错信息如下:
assertion failed: res.is_ok() thread 'runs' panicked at tests\cli.rs:7:5:
我将代码中let mut cmd = Command::new("ls");改为我的包名称后测试通过,想请教该测试失败的原因。
解答
测试失败的核心原因是你的操作系统环境中找不到ls命令:
ls是类Unix系统(Linux、macOS等)的默认目录列表命令,但Windows系统原生没有这个命令,对应的等效命令是dir。- 调用
Command::new("ls")时,Rust会在系统环境变量PATH中查找名为ls的可执行文件,找不到就会返回错误,导致res.is_ok()为false,触发断言失败。
而改为自己的包名称后测试通过,是因为cargo test运行时,项目的二进制文件已经编译完成,测试环境能正确定位到它的路径,所以命令执行成功。
如果想在Windows环境下让原示例代码通过测试,可以把ls替换为dir,或者安装Git Bash、WSL等类Unix环境并将其路径加入系统PATH。
内容的提问来源于stack exchange,提问作者Barbatos_Best_Bot
相关产品推荐
相关产品推荐

