如何使用 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()?;
所有内部 Command
和 output
变量似乎都是私有的,永远不会公开以检索原始 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 请求此确切功能。我建议你去那里,并告诉作者你对这个功能感兴趣。
我正在使用 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()?;
所有内部 Command
和 output
变量似乎都是私有的,永远不会公开以检索原始 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 请求此确切功能。我建议你去那里,并告诉作者你对这个功能感兴趣。