当前位置: 首页 > 知识库问答 >
问题:

为什么不打印!在Rust单元测试中工作?

郭华美
2023-03-14
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 --test app.rs; ./app

我还可以用

cargo test

我得到一条消息,说测试通过了,但println!从未显示在屏幕上。为什么不呢?

共有1个答案

锺离嘉茂
2023-03-14

发生这种情况是因为Rust测试程序隐藏了成功测试的stdout,以便测试输出整洁。您可以通过将--nocapture选项传递给测试二进制或Cargo test来禁用此行为:

#[test]
fn test() {
    println!("Hidden output")
}

调用测试:

% rustc --test main.rs; ./main

running 1 test
test test ... ok

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

% ./main --nocapture

running 1 test
Hidden output
test test ... ok

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

% cargo test -- --nocapture

running 1 test
Hidden output
test test ... ok

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

但是,如果测试失败,无论是否存在此选项,它们的stdout都将被打印。

 类似资料:
  • 以下是presenter中调用的方法: 下面是我的测试方法: 在Super.UpdateViewModel(vm)的处理程序中,我调用“SharedPreferenceHandler.MinStance.AccessToken!!)” 在我的测试方法中有可能得到这一点吗?

  • 所以我有这个代码,叫我白痴哈哈,但是我不能让它打印7。 代码: 我需要知道如何改变与函数中的参数同名的变量。 任何帮助都将不胜感激,如果你不明白这个问题,我很乐意解释更多。

  • 从Spring 3.1开始,由于@Enable*注释,我们可以更容易地使用JavaConfig。 所以我做了一个WebConfig来设置WebMvc配置,并尝试对其进行测试。但是,如果我使用WebConfig扩展WebMVCConfigureAdapter或WebMvcConfigurationSupport,单元测试将失败,因为缺少ServletContext。代码和消息如下所示。 网络配置。J

  • 为什么会这样?并不是说我绝对需要一个测试方法,我只是好奇而已。当您生成测试方法时,Visual Studio 2012不会给出警告或错误,即使它将无法运行。..

  • 问题内容: 第3、16、17、18和19行用*突出显示的含义是什么。有人可以解释他们的工作吗?我是python和编程新手 问题答案: 这段代码中只有三行用*突出显示,但这是它们的意思: 第一行: 这是在声明 后面 的函数( test_Iframe 和 tearDown )的 类* 。在面向对象的编程中,使用一个类来创建“对象” 。可以将 类 视为数据/过程的抽象,而 对象 是类的特定实例。 ***

  • 问题内容: 我有以下代码: 如果我没有在goroutine中从缓冲区读取的代码,它会输出这样的消息,这是我期望发生的事情: 但是,将其放在goroutine中不会打印任何内容。 有人可以解释为什么吗? 问题答案: 函数完成后,您的程序将退出。这很可能在您的goroutine有时间运行并打印其输出之前发生。 一种选择是从通道读取主goroutine块,并在完成工作后将goroutine写入通道。