代码之家  ›  专栏  ›  技术社区  ›  Logan Reed

如何使用assert\u cli crate从进程获取命令stdout?

  •  1
  • Logan Reed  · 技术社区  · 6 年前

    我正在使用 assert_cli 用于测试命令行应用程序的板条箱。虽然它对简单的用例非常有用( see some examples in this article ),有时我想获得作为 String 进行更复杂的检查(regex、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()?;
    

    所有内部 Command output 变量似乎是私有的,从不暴露于检索原始 标准装置 。此功能似乎太基本,不能忽略 assert\u cli 图书馆我可能错过了一些非常明显的东西。。。

    Q: 有什么办法可以生吃吗 标准装置 作为变量的内容返回?

    这是我理想的目标:

    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\u cli 因为我用它做了80%的测试。

    1 回复  |  直到 6 年前
        1
  •  2
  •   mcarton    6 年前

    该库仅定义了3种类型。所有这些都不允许直接访问输出。

    这个功能似乎太基本了,不能忽略 assert_cli 图书馆我可能错过了一些非常明显的东西。。。

    该库被称为 assert* 它具有在命令输出上断言stuff所需的所有功能。获取实际输出超出了“断言”的范围。

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