Rust 如何使用assert\u cli板条箱从进程获取命令stdout?
我正在使用crate测试一个命令行应用程序。虽然它对简单用例()非常有用,但有时我希望将我正在测试的命令的原始输出作为Rust 如何使用assert\u cli板条箱从进程获取命令stdout?,rust,integration-testing,Rust,Integration Testing,我正在使用crate测试一个命令行应用程序。虽然它对简单用例()非常有用,但有时我希望将我正在测试的命令的原始输出作为字符串来执行更复杂的检查(regex、json或输出中更复杂的逻辑) 为此,我需要逐字获得命令输出的副本。以下是一个例子: extern crate assert_cli; fn main() { let a = assert_cli::Assert::command(&["echo", "foo-bar-foo"]); a.execute();
字符串来执行更复杂的检查(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()
方法,但这需要并且不清楚如何访问stdout
的实际内容。您只能使用谓词语法执行一些简单的检查
assert\u cli
在执行过程中不会在内部获得命令的完整输出,如的源代码所示
所有内部命令
和输出
变量似乎都是私有的,并且从不公开以检索原始标准输出
。此功能似乎太基本,不能从assert\u 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");
}
我知道我可以单独使用来实现这一点。我想知道我是否仍然可以坚持使用assert\u cli
,因为我用它进行了80%的测试。库只定义了3种类型。所有这些都不允许直接访问输出
此功能似乎太基本,不能从assert\u cli
库中省略。我可能错过了一些非常明显的东西
该库称为assert*
,它具有在命令输出上断言内容所需的所有函数。获取实际输出超出了“断言”的范围
其他人打开了存储库,要求提供这个确切的功能。我建议你去那里,告诉作者你对这个特性感兴趣。这个库只定义了3种类型。所有这些都不允许直接访问输出
此功能似乎太基本,不能从assert\u cli
库中省略。我可能错过了一些非常明显的东西
该库称为assert*
,它具有在命令输出上断言内容所需的所有函数。获取实际输出超出了“断言”的范围
其他人打开了存储库,要求提供这个确切的功能。我建议你去那里,告诉作者你对这个功能感兴趣。谢谢,不知怎的,我在bug追踪器中错过了这个功能。。。我同意断言库不应该这样做的前提,但同时断言库没有提供足够的灵活性来实现所有类型的检查。第二次运行同一进程只是为了检查输出的不同部分似乎是浪费。还有一个我不想复制/粘贴到代码中的流程管理管道。我认为应该有这个功能,如果不是为了优雅,那么是为了效率。谢谢你,不知怎的,我错过了bug追踪器中的那个功能。。。我同意断言库不应该这样做的前提,但同时断言库没有提供足够的灵活性来实现所有类型的检查。第二次运行同一进程只是为了检查输出的不同部分似乎是浪费。还有一个我不想复制/粘贴到代码中的流程管理管道。我认为应该有这个功能,如果不是为了优雅,那么是为了效率。
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");
}