Rust测试中std::io::stdout()写入内容不显示的问题及解决
Rust测试中stdout写入内容不显示的问题解答
1. 为什么“-----------------------”未出现在测试的stdout中?
std::io::stdout()默认采用行缓冲模式,直接调用write()只是把数据写入了内存缓冲区,并没有立刻输出到终端。而println!宏在输出后会自动调用flush()刷新缓冲区,所以那两行内容能正常显示。测试结束前,缓冲区里的-----------------------还没被强制刷新,因此不会出现在最终输出里。
2. 正确的实现方式是什么?
有两种常用的解决办法:
方法一:手动调用flush()刷新缓冲区
在write()操作后主动调用flush(),强制将缓冲区内容输出:
#[test] fn show_test_2() { use std::io::Write; let mut buffer = std::io::stdout(); match buffer.write(&"-----------------------".as_bytes()) { Ok(_) => println!("Buffer write success"), Err(_) => println!("Buffer write failed"), }; // 手动刷新缓冲区 if let Err(e) = buffer.flush() { eprintln!("Failed to flush stdout: {}", e); } println!("+++++++++++++++++++++++"); assert!(false); }
方法二:使用writeln!宏(自动换行+刷新)
如果需要输出带换行的内容,writeln!宏和println!逻辑类似,会自动完成换行和缓冲区刷新:
#[test] fn show_test_2() { use std::io::Write; let mut buffer = std::io::stdout(); match writeln!(buffer, "-----------------------") { Ok(_) => println!("Buffer write success"), Err(_) => println!("Buffer write failed"), }; println!("+++++++++++++++++++++++"); assert!(false); }
修改后执行cargo test --lib,就能看到-----------------------正常输出了。
内容的提问来源于stack exchange,提问作者MezoBlast
相关产品推荐
相关产品推荐

