概要
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でテストできます。
基本的には一回やればおしまいの設定です。今後はこの設定を流用します。

詳細プロフィール。SNS: Twitter/[email protected]/[email protected]。2022-07-17からgnusocial.jpとweb.gnusocial.jpのサイトを運営しています。WordPressで分散SNSに参加しています。このアカウントの投稿に返信すると、サイトのコメント欄にも反映されます。自称ASD。
Comments
This Article was mentioned on web.gnusocial.jp
This Article was mentioned on web.gnusocial.jp