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";
}
上記の修正では当然単体テストがひとつのロケールでしか動かないため、必要に応じて複数のロケールで単体テストが動くように調整します。
Amazon欲しいものリスト
私が作業中に飲んでいるコーヒーや欲しいマンガなどを集めました。開発・執筆の励みになりますのでクリックして頂ければ幸いです。
<Amazon欲しいものリスト>