簡體   English   中英

如何使用 chrono 使用顯式時區運行 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM