如何在测试执行时使用 `fs::remove_dir_all` 来删除特定文件?

问题描述 投票:0回答:1

我正在开发一个使用 Rust 和 RocksDB 的项目,该项目在运行某些测试时创建数据库日志。每次运行测试时,都会再次创建路径并保存两者的信息。最终经过这么多次测试,会出现很多不必要的保存日志。

我的目标是在编译每个测试之前使用函数

std::fs::remove_dir_all
删除bd日志文件,这样每次都会有一个干净的石板来创建一个全新的db日志文件。

#[test]
pub fn it_deletes() -> std::io::Result<()> {
    fs::remove_dir_all("relative path/.dblog")?;
    Ok(())
}

当我制作上面所示的模拟测试函数并运行它时,不幸的是它不会删除该文件。但是,当我按“测试”选项旁边的“调试”(使用 vscode)时,它会成功删除该文件。然后,在调试控制台中我得到:

Console is in 'commands' mode, prefix expressions with '?'.
Launching: local debug path/it_deletes --exact --nocapture
Launched process 70701
Process exited with code 101.

此外,我在尝试运行货物测试时收到此错误。

---- it_deletes stdout ----
Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }

我是 Rust 的初学者,任何帮助将不胜感激!

rust rust-cargo rocksdb
1个回答
0
投票

您没有给我们一个可重现的示例,因此无法最终回答您提出的具体问题。不过,我确实有一些用于调试测试的一般性建议。

  1. 使用调试器。如果您通过 vscode 使用 rust-analyzer,那么您应该只需单击测试定义上方的“调试测试”按钮,如果您没有设置调试,我相信 vscode 会自动为您生成配置(您可能需要安装另一个扩展,也许是 lldb 扩展)。然后您可以设置断点并在执行期间检查测试的状态,包括整个调用堆栈。

  2. 为您想要检查的内容添加一些

    println!
    。当测试失败时,
    cargo test
    将向您显示该测试的标准输出,以便您可以看到打印的内容(使用 vscode 测试设置运行也应该向您显示某个地方,但我不太熟悉告诉您的界面你到底在哪里)。在这种情况下,我要检查的是运行测试时的工作目录,以及您传递给
    remove_dir_all
    的目录路径,以便您可以检查它们是否合理。

  3. 您可以在测试代码中随意使用

    expect
    (或
    unwrap
    )。如果您对错误发生的确切位置感到恐慌,那么会更容易准确地看到错误的来源(而不是通过潜在的长链
    Result
    )。您还可以运行
    RUST_BACKTRACE=1 cargo test
    来获得有关恐慌的完整回溯,这可以帮助查明问题。

  4. 如果您的测试与文件系统交互,请给它们一个临时目录来使用。有像 tempfilefigment 这样的包可以帮助你做到这一点。这意味着您破坏您关心的文件的可能性要小得多,并且如果您自动生成临时目录(在某些操作系统管理的临时目录中,因此它最终会被清理),您可以不删除它事后您自己检查内容以进行调试。

© www.soinside.com 2019 - 2024. All rights reserved.