🏸

時刻を表示させるReact ComponentのスナップショットテストがGithub actionsでだけ落ちる

2022/03/13に公開

現象

ある時刻を表示させるReact componentを作成

Component.tsx
// 2022/3/8
const date = props.date.toLocaleDateString()
// 18:39:04
const time = props.date.toLocaleTimeString()

ある固定のDateを流し込み、スナップショットテストを実行

Component.test.tsx
  const time: Date = new Date(1647165901000)
  const { asFragment } = render(
    <Component
      time={time}
    />,
  )
  expect(asFragment()).toMatchSnapshot()

ローカルでスナップショットを作成しテストの動作を確認。
その後、github actions上でpushの度にスナップショットテストを実施させたところ、
コード修正を行っていないのに以下のようなエラーでテストが失敗した。

    Snapshot name: `時刻を表示させるcomponentのテスト`

    - Snapshot  - 1
    + Received  + 1

    @@ -100,11 +100,11 @@
    -                 2022/3/8 18:39:04   NG
    +                 3/8/2022 09:39:04 AM  NG

そうか、、github actionsサーバはJSTじゃないですね。。。

対策

  1. テスト用に生成する時刻をサーバのtimezoneに依存しないようにする。
    getTimezoneOffset()についてはこちら
    Component.test.tsx
    // const time: Date = new Date(1647165901000)
    const time: Date = new Date(
      1647165901000
      + (new Date().getTimezoneOffset() + 9 * 60) * 60 * 1000)
    ) 
    
  2. 表示形式を日本式に統一
    Component.tsx
    // 2022/3/8
    // const date = props.date.toLocaleDateString()
    const date = props.date.toLocaleDateString('ja-JP')
    // 18:39:04
    // const time = props.date.toLocaleTimeString()
    const time = props.date.toLocaleTimeString('ja-JP', {hour12: false})
    

言われてみれば当たり前なんですが、意外と気づけなかったです。

Discussion