Madogiwa Blog

主に技術系の学習メモに使っていきます。

Vitestで時間を固定(`jest-date-mock`の`advancedTo`相当)する方法メモ📝

JestからVitestに移行する際に以下のような感じで jest-date-mockadvancedToを使って時刻の固定している箇所をvitestで再現するのに少しハマったのでメモ📝

以下のような形でadvanceToを使って引数で渡した時間に固定できる🕛

import { advanceTo } from "jest-date-mock";
advanceTo(new Date("2021-05-03T15:35:47+09:00"));

Vue✕TypeScriptなプロジェクトにJestを導入する方法MEMO👢 - Madogiwa Blog

vitestで時間を固定する方法

以下のようにadvanceToを使った時間を固定したテストの場合は、

import { mount } from "@vue/test-utils";
import Component from "@js/components/Foo.vue";
import { advanceTo } from "jest-date-mock";

describe("components/Foo.vue", () => {
  describe("default", () => {
    it("snapshot", () => {
      const props = { bar: 'bar' };
      advanceTo(new Date("2021-05-03T15:35:47+09:00"));
      const wrapper = mount(Component, { props: props });
      expect(wrapper.element).toMatchSnapshot();
    });
  });

以下のような形で書き換えると同様の挙動を再現できる✨

import { mount } from "@vue/test-utils";
import Component from "@js/components/Foo.vue";
import { advanceTo } from "jest-date-mock";

describe("components/Foo.vue", () => {
  describe("default", () => {
    it("snapshot", () => {
      const props = { bar: 'bar' };
      vi.useFakeTimers();
      vi.setSystemTime(new Date("2021-05-03T15:35:47+09:00"));
      const wrapper = mount(Component, { props: props });
      expect(wrapper.element).toMatchSnapshot();
      vi.useRealTimers();
    });
  });

参考

github.com