首页 > 解决方案 > 如何使用 chrono 以明确的时区运行 Rust 测试?

问题描述

我正在构建一些使用 chrono crate 在 Rust 中进行时间戳转换的测试。我需要确保它们考虑到本地时区,但测试将在多个时区运行,因此对于大多数测试人员来说都会失败。如何在运行测试时强制代码中的 Rust 或 chrono 使用特定时区?

我知道设置env TZ=CST或类似的。由于我无法控制所有正在运行的执行环境的那部分cargo test,我认为这对我们不起作用。

标签: testingtimerustautomated-tests

解决方案


如果所有测试都应该在同一时区运行,您可以使用注释中指出的std::sync::Once初始化-environment 变量。TZ从技术上讲,由于没有竞争条件,所有测试都可以将 env 初始化为该时区。

如果测试需要设置自己的时区 - 仅对那个测试有效 - 仍然修改整个过程的时区可能是最安全的(包括chrono,但libc龙中的某个地方也可以访问 tz)。正如您自己指出的那样,多个测试需要在它们的共享环境上同步。你可以这样做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其中当前想要在同一时区下运行的所有线程都可以同时运行。


推荐阅读