testing - 如何使用 chrono 以明确的时区运行 Rust 测试?
问题描述
我正在构建一些使用 chrono crate 在 Rust 中进行时间戳转换的测试。我需要确保它们考虑到本地时区,但测试将在多个时区运行,因此对于大多数测试人员来说都会失败。如何在运行测试时强制代码中的 Rust 或 chrono 使用特定时区?
我知道设置env TZ=CST
或类似的。由于我无法控制所有正在运行的执行环境的那部分cargo test
,我认为这对我们不起作用。
解决方案
如果所有测试都应该在同一时区运行,您可以使用注释中指出的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
其中当前想要在同一时区下运行的所有线程都可以同时运行。
推荐阅读
- java - Spring配置只授权一个URL
- c# - 视图状态 MAC 验证失败。至少一个月内没有更改代码
- python - 如何获取python抓取的json结果
- c# - System.ArgumentOutOfRangeException: '提供的 resourceId 不是有效的 Socrata (4x4) 资源标识符
- json - [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] 的问题未处理的异常:类型“String”不是“index”类型“int”的子类型
- javascript - 在 NextJS 中延迟加载组件而不使用 `next/dynamic`
- emacs - How to get declaration order AUTOINST with emacs verilog-mode?
- asp.net - 缓慢的 ASP.NET 响应。IIS 失败请求日志中的 VIRTUAL_MODULE_UNRESOLVED
- javascript - 在创建之前使用 Sequelize 模型验证来验证 JSON 对象
- javascript - 在 chorme 上使用鼠标滚轮进行跳跃滚动(Windows)