Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么';t println!在单元测试中工作?_Rust_Println - Fatal编程技术网

Rust 为什么';t println!在单元测试中工作?

Rust 为什么';t println!在单元测试中工作?,rust,println,Rust,Println,我已经实现了以下方法和单元测试: use std::fs::File; use std::path::Path; use std::io::prelude::*; fn read_file(path: &Path) { let mut file = File::open(path).unwrap(); let mut contents = String::new(); file.read_to_string(&mut contents).unwrap()

我已经实现了以下方法和单元测试:

use std::fs::File;
use std::path::Path;
use std::io::prelude::*;

fn read_file(path: &Path) {
    let mut file = File::open(path).unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    println!("{}", contents);
}

#[test]
fn test_read_file() {
    let path = &Path::new("/etc/hosts");
    println!("{:?}", path);
    read_file(path);
}
我以这种方式运行单元测试:

rustc——测试app.rs/应用程序
我也可以用

货物测试

我收到一条消息说测试通过了,但是
println永远不会显示在屏幕上。为什么不呢?

测试时,不显示标准输出。不要使用文本消息进行测试,而是
assert
assert\u eq,和
失败取而代之。Rust的单元测试系统可以理解这些,但不能理解文本消息

即使出了问题,你写的测试也会通过。让我们看看原因:

从头到尾读取
的签名为
fn自始至终读取(&mut self)->IoResult

它返回一个
IoResult
,以指示成功或错误。这只是
结果的类型def,其错误值为
IoError
。由您决定如何处理错误。在这种情况下,我们希望任务失败,这是通过调用
结果
上的
展开
来完成的

这将有助于:

let contents = File::open(&Path::new("message.txt"))
    .read_to_end()
    .unwrap();

但不应过度使用
unwrap

这是因为锈蚀测试程序隐藏了成功测试的标准,以便测试输出整洁。您可以通过将
--nocapture
选项传递到测试二进制文件或
货物测试来禁用此行为:

#[test]
fn test() {
    println!("Hidden output")
}
调用测试:

%c—测试main.rs/主要的
运行1测试
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
%/主-无捕获
运行1测试
隐藏输出
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
%货物测试--nocapture
运行1测试
隐藏输出
测试测试。。。好啊
测试结果:可以。1人通过;0失败;忽略0;0测量
但是,如果测试失败,则无论此选项是否存在,都将打印其标准输出。

TL;博士

$ cargo test -- --nocapture
使用以下代码:

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum PieceShape {
    King, Queen, Rook, Bishop, Knight, Pawn
}

fn main() {
    println!("Hello, world!");
}

#[test]
fn demo_debug_format() {
    let q = PieceShape::Queen;
    let p = PieceShape::Pawn;
    let k = PieceShape::King;
    println!("q={:?} p={:?} k={:?}", q, p, k);
}
然后运行以下命令:

 $ cargo test -- --nocapture
你应该看到

Running target/debug/chess-5d475d8baa0176e4

running 1 test
q=Queen p=Pawn k=King
test demo_debug_format ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

将打印输出包含在
println!()
并保留测试结果的颜色,使用
货物测试中的
颜色
无捕获
标志

$ cargo test -- --color always --nocapture
(cargo版本:0.13.0 nightly)

正如,
--显示输出是一条路要走

现在是

$cargo test--show输出

您提到要通过
--nocapture
选项进行
货物测试
,但货物对我来说无法识别此标志(使用rustup.sh的最新夜间版本)。“你确定它会起作用吗?”JimGarrison,确实如此。同时,您可以使用
货物测试--nocapture
,它应该可以工作。谢谢!与这个问题无关,但这也帮助我找到了如何让
货物测试[-]--工作台
工作的方法@Nashenas,该选项被称为
nocapture
,而不是
no-capture
@namone2000
——nocapture
在2018版中仍然有效<代码>--显示输出
是另一个以更容易查看的格式组织输出的选项。
货物测试----无捕获
不再工作。我得到以下错误:
线程“”在“无法识别的选项:\'no-capture\'”处惊慌失措,../src/libtest/lib.rs:249
我想知道这个问题是否是问题所在?正如前面的评论中指出的,选项是
--nocapture
,而不是
--no-capture
。然而,考虑到我们经常遇到的大多数命令行约定,这是一个非常明显的错误。我只是按照rust 1.1(cargo 0.2.0)中的回答使用了这个选项,它的工作原理与广告完全一样。