JavaScript IntlをJestで動かしたらエラー RangeError: Incorrect locale information provided

多言語・多通貨対応のため JavaScript ライブラリ Intl を利用しています。単体テストのために Intl を Jest で動かそうとしたのですが、エラー RangeError: Incorrect locale information provided が発生しました。エラーの内容・原因・対応方法についてまとめます。

エラーの内容

 FAIL  components/__tests__/hoge.tsx
  ● Test suite failed to run

    RangeError: Incorrect locale information provided
        at Object.NumberFormat (<anonymous>)

      228 |     return '万円'
      229 |   } else {
    > 230 |     return Intl.NumberFormat(i18n.locale, { style: 'currency', currency })
          |                 ^
      231 |       .format(0)
      232 |       .replace(/[0.,\s]/g, '')
      233 |   }

      at getCurrencySymbol (localization/i18n.tsx:230:17)
      at Object.getCurrencyUnit (localization/i18n.tsx:219:16)
      at Object.<anonymous> (constants/Labels.tsx:20:30)
      at Object.<anonymous> (constants/index.tsx:1:1)

原因

原因は、Jest を動かしたときの Localization.locale が”mock”になっていることでした。ロケールは環境変数ですよね。特に何も指定せずに Jest を動かすと、デフォルトのロケールとして"mock"が設定されるようです。

対応方法

"mock"のときはロケール情報を読み替えるように修正して対応しました。

if (__DEV__ && i18n.locale === "mock") {
  i18n.locale = "ja-JP";
}

上記の修正では当然単体テストがひとつのロケールでしか動かないため、必要に応じて複数のロケールで単体テストが動くように調整します。