我正在进行一个涉及文件交互的项目,希望使用文本文件来测试我的工作。但是测试不是从 tests/
目录运行的,因此在运行 cargo run
时无法可靠地找到它们。
Cargo 是否总是从根目录运行测试(看起来是这种情况,但我没有找到任何证明)?
我正在进行一个涉及文件交互的项目,希望使用文本文件来测试我的工作。但是测试不是从 tests/
目录运行的,因此在运行 cargo run
时无法可靠地找到它们。
Cargo 是否总是从根目录运行测试(看起来是这种情况,但我没有找到任何证明)?
环境变量CARGO_MANIFEST_DIR
可以为您提供一个稳定的基准点来引用其他文件。这里,我们假设在箱顶有一个resources/test
目录:
use std::path::PathBuf;
fn main() {
let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
d.push("resources/test");
println!("{}", d.display());
}
另请参阅:
在@Shepmaster提供的答案基础上,假设您打算读取文件进行测试:
macro_rules! test_case {($fname:expr) => (
concat!(env!("CARGO_MANIFEST_DIR"), "/resources/test/", $fname) // assumes Linux ('/')!
)}
这个只是在你的单元测试中简单使用:
test_case!("json_data/example.json")
更或者说是在编译时实现了相同的目标(有助于捕获缺失的文件),并且非常简洁。如果有人知道如何使这个编译时和平台无关,请随时编辑。
请参阅rust-lang问题#2841中的完整讨论
let d: PathBuf = [env!("CARGO_MANIFEST_DIR"), "resources", "test"].iter().collect();
- Raniz