在寫某個玩具項目的時候,需要在 integration test 中讀取某個復(fù)雜的配置文件。而讀取這個文件本身也是測試的一部分。目錄結(jié)構(gòu)如下:
Proj
|- src
|- tests
|- my_tests.rs
|- some.conf
但是使用 cargo test 時,執(zhí)行目錄并不確定(可以更改 target 路徑),因此這里必須在代碼中使用絕對路徑讀取 some.conf。
好在 Rust 確實隱蔽地提供了這么一個功能,因為 Cargo 在編譯時必須知道項目的位置,因此會設(shè)置一個環(huán)境變量 CARGO_MANIFEST_DIR。這個環(huán)境變量就是 Cargo.toml 文件所在的文件夾,也就是 項目文件夾的絕對路徑。通過它,我們可以自己手動拼接一個 some.conf 的絕對路徑:
use std::path::PathBuf;
#[test]
fn test_something() {
// omitted...
let mut config_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
config_path.push("tests");
config_path.push("some.conf");
println!("config file: {:?}", config_path);
// omitted...
}