我正在构建一些测试,使用 chrono crate 在 Rust 中进行时间戳转换。我需要确保他们考虑到本地时区,但测试将在多个时区运行,因此对于大多数测试人员来说会失败。在运行测试时,如何强制代码中的 Rust 或 chrono 使用特定时区?
我知道如何设置 env TZ=CST
或类似的。由于我无法控制所有运行 cargo test
的那部分执行环境,因此我认为这对我们不起作用。
最佳答案
如果所有测试都应在相同 时区运行,您可以使用std::sync::Once
初始化 TZ
- 评论中指出的环境变量。从技术上讲,由于没有竞争条件,所有测试都可以将环境初始化为该时区。
如果测试需要设置它们自己的时区 - 只对那个测试有效 - 仍然修改整个过程的时区可能是最安全的(包括 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
来获得更多乐趣,其中当前想要在同一时区下运行的所有线程都可以同时运行。
关于testing - 如何使用 chrono 运行带有明确时区的 Rust 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56711076/