我正在为命令行工具编写测试,它允许您指定寻呼机。我想测试该工具传递正确的参数。我想我会编写一个单行二进制文件来检查参数并退出时使用非零状态代码(加上一些STDERR输出)如果它们不正确,然后在运行此二进制文件的tests/
下进行测试并检查其输出,我可以像往常一样使用cargo test
运行。如果我将二进制文件放在src/bin
下,则此设置有效,但在使用cargo install
时也会安装测试二进制文件。
当我在.rs
下放置二进制文件的tests/
文件时,它根本就没有编译成二进制文件。
我尝试将它放在同一个工作区的箱子里,但是当它在根箱中运行cargo build
时它没有被构建...除非我将它指定为默认成员,在这种情况下我们回到使用cargo install
时安装它。
例如,给定代码如下:
use std::process::Command;
fn run_pager(pager: &str) {
let output = Command::new(&pager)
.env("SOME_VAR", "FOO")
.spawn()
.expect("failed to run pager");
// do something with the command
}
和一个看起来像这样的存根test-binary.rs
:
use std::env;
fn main() {
assert_eq!(env::var("SOME_VAR").unwrap(), "FOO");
// …produce output with special markers…
}
我怎么能写tests/passes-correct-args.rs
:
#[test]
fn runs_pager_with_args() {
// pass `test-binary` to `run_pager` and verify output
}
使您的测试二进制文件成为src
下的新Cargo项目,然后使用相对路径在主项目中将其作为dev依赖项引用。
[dev-dependencies]
test_binary = { path = "src/test_binary", version = "0.1" }