Jestによるテスト実行時のタイムゾーンを固定する


タイムゾーンによるテストへの影響

Jestを使って現在時刻の表示処理のようなテストをする場合、タイムゾーンが問題となるケースがあります。これは、開発に使うPCのタイムゾーンと、テストを実行するCIのタイムゾーンが異なるケースがあるためです。

例えば、開発用マシンは日本標準時(UTC+9)になっているのに対し、CircleCIやTravisCIなどのタイムゾーンがUTC+0だと、テストで得られる結果が異なり、どちらか一方で行われたテストが失敗することがあります。

Jestのテスト実行時のタイムゾーン指定方法

Jestでテストを実行する際に、環境に依存することなく明示的にタイムゾーンを指定する場合は、 globalSetupprocess.env.TZ を指定すれば良いです。具体的には以下のように設定します。

package.json
{
  "jest": {
    "globalSetup": "./jest-global-setup.js"
  }
}

(上は package.json を例としていますが、 jest.config.js を使用している場合も設定方法は同様です)

jest-global-setup.js
module.exports = async () => {
  process.env.TZ = 'Asia/Tokyo'; // 固定したい任意のタイムゾーンを指定
};

その他の方法

なお、蛇足ではありますが、 CircleCIの場合はコンテナのタイムゾーンを指定する方法 もあるので、このアプローチを使うこともできます。

参考