在 vitest 中设置时区

Che*_*leg 5 testing timezone mocking vitest

我想在我的 Vitest 测试中设置(实际上是模拟)一个时区,以便在它们将运行的所有时区中获得确定性结果。我在本地计算机以及具有不同时区的 CI/CD 环境中运行我的测试。

我在 Stackoverflow 上搜索了一些答案,但还没有找到一个好的清晰方法来在 vitest 中做到这一点。

Sim*_*ran 6

创建文件vitest.global-setup.ts

export const setup = () => {
  process.env.TZ = 'UTC'
}
Run Code Online (Sandbox Code Playgroud)

然后将其添加globalSetupvitest.config.ts

export default defineConfig({
  test: {
    globalSetup: './vitest.global-setup.ts',
    // ...
  },
Run Code Online (Sandbox Code Playgroud)

(在这个 GitHub 评论中找到了解决方案)


Jus*_*son 1

您不能直接“模拟”时区。最接近的方法是在运行 vitest 时设置 TZ 环境变量。

例如:TZ=UTC vitest

我将其保存在 package.json 中作为脚本,然后像这样执行该脚本:

{
  scripts: {
    test: "TZ=UTC vitest"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后就跑吧,yarn test这样我就不用考虑它了。这给了我确定性的时区。这加上 avi.setSystemTime应该可以满足您的需求。

如果您需要测试不同的时区,我认为在测试本身中不可能做到这一点。您必须使用不同的环境变量多次运行 vitest。

有关更多信息,请参阅此问题:https ://github.com/vitest-dev/vitest/issues/1575

vi.setSystemTime:https://vitest.dev/api/vi.html#vi-setsystemtime