JestのES2015対応設定

develop/JavaScript
概要

JavaScriptのテストフレームワークにJestを検討して試していたら、JestがデフォルトではES2015に対応しておらず、Node.jsを使っていないJavaScriptで使えないことに気づきました。

具体的にはexport/import文に対応していないのが問題でした。順番が前後してしまいますが、設定で対応できるようなので、先に方法を記録します。Jest v29.5+Node.js v18.10.0で確認しました。

JestをES6化してimport/exportを使う方法」の内容を参考にしました。

内容

まず、Jestのサンプルコード (Getting Started · Jest) は以下のようになっています。

// sum.js
function sum(a, b) { return a + b; } module.exports = sum;
// sum.test.js
const sum = require('./sum'); test('adds 1 + 2 to equal 3', () => { expect(sum(1, 2)).toBe(3); });

ここでES2015のexport/import文ではなく、module.exportsとrequireでモジュールのエクスポート・インポートを行っています。

JestはNode.jsの標準に準拠していて、CommonJSのAPIを基本としているためのようです。

このままだと、ES2015で追加されたexport/import文が使えません。

対処方法が「ECMAScript Modules · Jest」にあります。

  • package.jsonに"type": "module"を追加。
  • nodeの実行オプションに--experimental-vm-moduleを指定 (環境変数NODE_OPTIONS=--experimental-vm-modulesも可)。

これを満たすようにpackage.jsonを編集します。例えば以下のようになります。

{
  "type": "module",
  "scripts": {
    "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest"
  },
  "devDependencies": {
    "jest": "^29.5.0"
  }
}

NODE_OPTIONSに--no-warningsを指定しています。–experimental-vm-modules を指定すると、以下のような警告が毎回表示されます。

npm test
> test
> NODE_OPTIONS='--experimental-vm-modules' jest

(node:22053) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 PASS  ./sum.test.js
  ✓ adds 1 + 2 to equal 3 (2 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.258 s, estimated 1 s

テストごとに毎回表示されるのが邪魔なので、--no-warningsを指定して非表示にしています。

結論

JestでES2015の対応方法でした。

これでNode.jsを使っていないプロジェクトでもES2015のexport/import文を使うことでJestでテストできます。

基本的には一回やればおしまいの設定です。今後はこの設定を流用します。

Comments

  1. This Article was mentioned on web.gnusocial.jp

  2. This Article was mentioned on web.gnusocial.jp

Copied title and URL