如何测试Rust程序传递给另一个程序的参数?

时间:2018-09-06 13:33:36

标签: testing rust command-line-interface

我正在为命令行工具编写测试,该工具可让您指定寻呼机。我想测试该工具是否传递了正确的参数。我以为我要编写一个单行二进制文件来检查参数,如果参数不正确,则返回非零状态码(加上一些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
}

1 个答案:

答案 0 :(得分:0)

src下将测试二进制文件新建一个Cargo项目,然后使用相对路径在您的主项目中将其作为开发依赖项引用。

[dev-dependencies] test_binary = { path = "src/test_binary", version = "0.1" }