要約
Reactivity Transformを使った$1をテストしていて、それが原因でJestが落ちるときは、@vue/[email protected]
以上を導入しよう!
yarn add -D @vue/vue3-jest@latest
環境
※この記事は2022/03/15書いたものです。執筆時点ではReactivity Transform自体がExperimentalかつ、vue-jestのアルファ版でしか対応していないため下記のような対応が必要になりますが、しばらくすればここらへんは意識しなくても良くなるはずです。
- Vue:3.2.26
- Jest:27.5.1
前提:Reactivity Transformとは
Vue 3.2.25からExperimentalとして追加された$1ーマクロで、Vueが提供しているReactiveな値を.value
を経由せずに取得することができるようになります。
公式ドキュメントでは以下の章で紹介されていて、refだけでなく、computedも$computedとして使用することができます。
問題:JestがReactivity Transformを解釈できない
今開発しているアプリはWebpackを利用しているので(正確にはWebpacker…殺せっ!)、ドキュメントの通り、明示的に設定に追記することでこの機能を有効化することができます。
これでアプリ実行時はうまくいくのですが、$1に使用しているJestではWebpackは関係ないため、この構文の解釈ができずにエラーになります。
今回はこれを解消します。
[email protected]以上を導入する
対処:@vue/yarn add -D @vue/[email protected]
もしくは@vue/vue3-jest@latest
を実行します。
2022/03/15時点ではalpha4が最新版なので、こう書いていますが27.0.0-alpha.3以上を導入すればOKです。
これによりテスト実行時のログに、webpackで実行したときと同じようにexperimentalに対するログが出るようになり、Reactivity Transformが正しく解釈されるようになります。
解説
Reactivity Transformのみならず、Vueの仕様についてはGitHub Discussionsにて議論されています。
この中でJestへの対応に関する質問がありました。
VueとAngularのコントリビュータであるCédricさんが「vue3-jest」に新しいオプションを加えたよという話をしています。それがこのPRです。
READMEにも同様の内容が書いてあるのですが、27.0.0-alpha3以降は以下のオプションでReactivity Transformを解釈できるようになります。
デフォルトではこれがtrueだそうで、先に述べた通りalpha3以上を導入すれば自動的にReactivity Transformが解釈できるようになるわけです。
おわりに
これを解消したはいいんですけど、まだ私のJestはエラーを出力しています。やばいですねっ!