提问人:jianliang wang 提问时间:10/14/2023 更新时间:10/14/2023 访问量:62
写!宏在 Rust 中无法与异步函数一起正常工作
write! macro does not work properly with async function in Rust
问:
这是我的功能的简化版本:
async fn show_status(root_dir: &PathBuf, mut output: impl std::io::Write) -> Result<(), Error> {
writeln!(output, "status:");
let mut commponent_ids = walk_components(&StatusVisitor::new(), &root_dir, None).await?;
writeln!(output, "ids: {:?}", commponent_ids);
output.flush();
Ok(())
}
这是我的测试用例:
#[cfg(test)]
mod tests {
use super::show_status;
#[tokio::test]
async fn test_show_status() {
let mut output = Vec::new();
show_status(&main_repo_dir, &mut output).await;
assert_eq!(std::str::from_utf8(output.as_slice()).unwrap(), "status:\nids: [0, 1]");
}
}
我认为案件可能会按预期通过,但事实是我遇到了以下失败:
assertion `left == right` failed
left: "status:\n"
right: "status:\nids: [0, 1]\n"
我不知道为什么在输出中看不到第二行。谁能给我一些帮助?
我问过 chatgpt,它告诉我使用这些特征而不是 .但是当我尝试解决方案时,没有任何改变。tokio::io::AsyncWriteExt
std::io::Write
我还尝试过直接在主函数中调用函数,而不是在测试用例中调用它。出乎意料的是,我工作正常。我在 stdout 中看到了两行。
所以我的问题是:测试用例发生了什么?为什么我在异步测试用例的输出中看不到第二行?
答: 暂无答案
评论
walk_components
writeln!
show_status
async
show_status
.await
.await
walk_components
show_status(&main_repo_dir, &mut output).await;
show_status(&main_repo_dir, &mut output).await.unwrap();