如何使用assert_cli crate从进程获取命令stdout?

时间:2018-04-19 19:29:40

标签: rust integration-testing

我正在使用assert_cli crate来测试命令行应用程序。虽然它对简单的用例(see some examples in this article)非常有帮助,但有时我想得到我正在测试的命令的原始输出为String来进行更复杂的检查(正则表达式,json或更多)输出中的复杂逻辑。)

为此我需要逐字获取命令输出的副本。这是一个例子:

extern crate assert_cli;

fn main() {
    let a = assert_cli::Assert::command(&["echo", "foo-bar-foo"]);
    a.execute();
    println!("{:?}", a.expect_output);
}

有点可以预见它会给我以下错误:

error[E0616]: field `expect_output` of struct `assert_cli::Assert` is private
  --> src/main.rs:14:22
   |
14 |     println!("{:?}", a.expect_output);
   |                      ^^^^^^^^^^^^^^^

它还有一个.stdout()方法,但这需要OutputAssertionBuilder,而且如何访问stdout实际内容并不明显。您只能使用谓词语法进行一些简单的检查。

assert_cli在执行期间内部获取命令的完整输出,如assert.rs

的源代码所示
let output = spawned.wait_with_output()?;

所有内部Commandoutput变量似乎都是私有的,并且永远不会公开以检索原始stdout。此功能似乎太基础,无法从assert_cli库中省略。我可能遗漏了一些非常明显的东西......

问:有没有办法让原始stdout作为变量的内容返回?

这是我想要达到的理想目标:

extern crate assert_cli;

fn main() {
    // do simple checkign with assert_cli
    let a = assert_cli::Assert::command(&["echo", "foo-bar-foo"])
        .stdout().contains("foo-bar-foo")
        .unwrap();

    // get raw stdout
    let cmd_stdout = a.get_raw_stdout(); // how to do it?

    // do some additional complex checking
    assert_eq!(cmd_stdout, "foo-bar-foo");
}

P.S。:我知道我可以单独使用std::process::Command来实现这一目标。我想知道我是否仍然坚持assert_cli,因为我用它进行了80%的测试。

1 个答案:

答案 0 :(得分:2)

该库仅定义了3种类型。其中任何一个都不允许直接访问输出。

  

此功能似乎太基础,无法从assert_cli库中省略。我可能遗漏了一些非常明显的东西......

该库名为assert*,它具有在命令输出上断言东西所需的所有函数。获得实际输出超出了"断言"。

的范围

其他人在存储库中打开了an issue,要求提供此确切功能。我建议你去那里,并告诉作者这个功能让你感兴趣。