如何使用 assert_cli crate 从进程中获取命令标准输出?

How can I get command stdout from a process using assert_cli crate?

我正在使用 assert_cli crate to test a command line application. While it is very helpful with simple use cases (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 并且那里也不清楚如何访问 实际内容 17=]。您只能使用谓词语法进行一些简单的检查。

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% 的测试。

库只定义了 3 种类型。 None 其中允许直接访问输出。

This functionality seems to be too basic to be omitted from assert_cli library. I am probably missing something very obvious...

该库名为 assert*,它具有您在命令输出中声明内容所需的所有函数。获取实际输出超出了 "assertions".

的范围

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