如何在Vitest中设置(模拟)时区以保障测试结果确定性?
在Vitest中模拟时区的几种可行方案
1. 全局统一配置(推荐用于全项目测试)
直接在Vitest配置文件中设置TZ环境变量,让所有测试都使用指定时区,彻底避免环境差异。
修改vitest.config.ts(或.js):
import { defineConfig } from 'vitest/config' export default defineConfig({ test: { env: { // 这里可以设置任意合法时区,比如 'UTC'、'Asia/Shanghai'、'America/Los_Angeles' TZ: 'UTC' } } })
不管本地机器或CI/CD的系统时区是什么,所有测试都会以你指定的时区运行,日期相关输出完全一致。
2. 单测试文件/用例动态设置
如果不同测试需要不同时区,可以在测试文件内临时修改环境变量,记得测试完成后恢复原时区,避免污染其他测试。
示例:
import { describe, it, expect, beforeAll, afterAll } from 'vitest' // 保存原时区 const originalTZ = process.env.TZ describe('时区敏感测试', () => { beforeAll(() => { // 设置测试用的时区 process.env.TZ = 'Asia/Shanghai' }) afterAll(() => { // 恢复原时区 process.env.TZ = originalTZ }) it('应该输出上海时区的日期', () => { const date = new Date('2024-01-01T00:00:00Z') // 上海时区比UTC+8,所以本地时间是2024-01-01 08:00:00 expect(date.getHours()).toBe(8) }) })
3. 针对浏览器环境测试的补充
如果你的测试在jsdom环境下运行(默认浏览器模拟),TZ环境变量同样生效,上面的全局配置或动态设置方法都适用,无需额外配置。
注意事项
- 对于Day.js、Luxon这类第三方日期库,大部分会自动读取
TZ环境变量,但如果库本身有单独的时区配置,需要同步调整(比如Day.js的dayjs.tz.setDefault())。 - 不要在测试中途随意修改时区,否则会导致同一测试文件内的用例互相干扰,一定要在
beforeAll/afterAll或beforeEach/afterEach中做设置和恢复。
内容的提问来源于stack exchange,提问作者Chen Peleg
相关产品推荐
相关产品推荐

