我正在使用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()?;
所有内部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%的测试。
答案 0 :(得分:2)
该库仅定义了3种类型。其中任何一个都不允许直接访问输出。
此功能似乎太基础,无法从
assert_cli
库中省略。我可能遗漏了一些非常明显的东西......
该库名为assert*
,它具有在命令输出上断言东西所需的所有函数。获得实际输出超出了"断言"。
其他人在存储库中打开了an issue,要求提供此确切功能。我建议你去那里,并告诉作者这个功能让你感兴趣。