Vueのユニットテストを書こうと思い調べてみたが、ざっと読んだところ、Vue CLI の利用を前提にしている文書が多かった。
だが現実的には、何らかの理由で Vue CLI を使わない、使っていないというケースも多いはず。
そこで、Vue CLI を使わない環境でユニットテストを導入する方法を調べた。
テストフレームワークはJest
、アサーションライブラリはpower-assert
を導入する。
使っているライブラリのバージョンは以下。
- @babel/core@7.1.6
- @babel/preset-env@7.1.6
- @vue/test-utils@1.0.0-beta.25
- babel-core@7.0.0-bridge.0
- babel-jest@23.6.0
- babel-preset-power-assert@3.0.0
- jest@23.6.0
- power-assert@1.6.1
- vue@2.5.17
- vue-jest@3.0.0
- vue-template-compiler@2.5.17
最低限のセットアップ
$ npm init -y
でプロジェクトを開始し、以下のコマンドを実行して必要なライブラリをインストールする。
既にVueの開発を行っている場合はインストール済みのライブラリもあるだろうから、それは省く。
$ npm i vue $ npm i -D jest vue-jest vue-template-compiler @vue/test-utils @babel/core babel-jest babel-core@7.0.0-bridge.0 @babel/preset-env
@vue/test-utils
は、Vue コンポーネントのユニットテストを行うための公式ライブラリ。
shallowMount
などを使えるようになる。まだ詳しく調べていないが、React で言うところのenzyme
のようなものだろうか。
インストールが終わったら、package.json
にjest
ブロックを追加して、以下のように書く。
"jest": { "transform": { "^.+\\.js$": "babel-jest", "^.+\\.vue$": "vue-jest" } },
それと、プロジェクト直下に.babelrc
に作成してpresets
に@babel/preset-env
を設定する。
既に開発を行っているなら.babelrc
は作成済みの可能性が高いが、まっさらな状態から作るなら以下の内容になる。
{ "presets": ["@babel/preset-env"] }
これでユニットテストを実行する準備は出来たので、適当にテストを書いてみる。
まずはテスト対象のコンポーネント。
src/App.vue
。
<template> <div> <p>{{ message }}</p> </div> </template> <script> export default { data() { return { message: 'Hello Vue!', }; }, }; </script>
次に、テストコード。
src/__tests__/App.test.js
。
import {shallowMount} from '@vue/test-utils'; import App from '../App.vue'; const assert = require('assert'); describe('test', () => { describe('Vue', () => { it('shallowMount', () => { const wrapper = shallowMount(App); assert.equal(wrapper.text(), 'Hello Vue!'); }); }); });
これで$ npx jest
とすると、テストが実行される。
$ npx jest PASS src/__tests__/App.test.js test Vue ✓ shallowMount (15ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 2.103s Ran all test suites.
正しく動いているのが分かる。
power-assert を導入する
このままでも問題ないが、テスト失敗時のメッセージを分かりやすくするためpower-assert
を導入する。
まずはインストール。
$ npm i -D power-assert babel-preset-power-assert
次に.babelrc
を更新して、env.test.presets
にpower-assert
を設定する。
{ "presets": ["@babel/preset-env"], "env": { "test": { "presets": ["power-assert"] } } }
これで、テストコードのなかでconst assert = require('assert');
を実行したときに自動的にpower-assert
が読み込まれる。
テストの内容をassert.equal(wrapper.text(), 'Hello')
にしてわざと失敗させて確認してみる。
まずはpower-assert
を使わないケース。
● test › Vue › shallowMount assert.equal(received, expected) or assert(received) Expected value to be equal to: "Hello" Received: "Hello Vue!" Difference: - Expected + Received - Hello + Hello Vue! 9 | it('shallowMount', () => { 10 | const wrapper = shallowMount(App); > 11 | assert.equal(wrapper.text(), 'Hello'); | ^ 12 | }); 13 | }); 14 | });
power-assert
を使うと、上記の内容に加えて以下のメッセージが追加される。
Message: # src/__tests__/App.test.js:11 assert.equal(wrapper.text(), 'Hello') | | | "Hello Vue!" VueWrapper{isFunctionalComponent:undefined,_emitted:#Object#,_emittedByOrder:#Array#}