![](/img/trans.png)
[英]How do you run the main binary and then run tests based on it in Rust?
[英]How to run Rust tests with an explicit time zone using chrono?
我正在構建一些使用 chrono crate 在 Rust 中進行時間戳轉換的測試。 我需要確保他們考慮到本地時區,但測試將在多個時區運行,因此大多數測試人員都會失敗。 在運行測試時,如何強制代碼中的 Rust 或 chrono 使用特定時區?
我知道設置env TZ=CST
或類似的。 由於我無法控制所有運行cargo test
的執行環境的那部分,我認為這對我們不起作用。
如果所有測試都應在同一時區中運行,則可以使用std::sync::Once
來初始化注釋中指出的TZ
-environment 變量。 從技術上講,由於沒有競爭條件,所有測試都可以將 env 初始化為該時區。
如果測試需要設置自己的時區 - 僅對那個測試有效 - 仍然修改整個過程的時區可能是最安全的(包括chrono
,但在libc
龍的某個地方也可以訪問 tz )。 正如您自己指出的那樣,多個測試需要在其共享環境中同步。 您可以使用lazy_static
做到這lazy_static
:
#[macro_use]
extern crate lazy_static;
lazy_static! {
static ref TZ_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
}
fn with_tz<R, F: FnOnce() -> Result<(), R>>(tz: &str, f: F) -> Result<(), R> {
let tz_lock = TZ_LOCK.lock();
std::env::set_var("TZ", tz);
f()
}
#[test]
fn foobar() -> Result<(), ()> {
with_tz("CET", || {
Ok(())
})
}
您可以通過使用更復雜的TZ_LOCK
來獲得更多幻想,其中當前想要在同一時區下運行的所有線程都可以同時運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.