testing - 如何使用 chrono 运行带有明确时区的 Rust 测试?

标签 testing time rust automated-tests

我正在构建一些测试,使用 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/

相关文章:

javascript - 如何避免为每个 Jest 测试用例重新运行异步 API 调用?

testing - 去基准和 gc : B/op alloc/op

time - HIVE:如何计算时间的秒差格式:yyyyMMdd HH:mm:ss

date - 如何在 Magento 中获取订单时间?

rust - 将自由函数迁移到特征时的生命周期不匹配

testing - PSTN调用模拟测试平台

ruby-on-rails - Rails 断言参数上的方括号

PHP时间过滤和MYSQL过滤

rust - 从定界文件解析变量

generics - 实现拥有和借用的特征