Vue.jsでユニットテスト

WRITER: y.harada
2022/03/14

今回はVue.jsでユニットテストを行う方法をまとめました

Vue.jsのユニットテストとは、コンポーネント単位のテストです

コンポーネントに対するインプットで期待するアプトプットを得られるかをテストします

インプットとはdata,propsなどコンポーネントの状態、クリックなどのユーザーイベントなどで

アウトプットとはHTMLの描画や更新後のコンポーネントの状態になります

テストツール

Vue.jsでテストを行うには、VueのコンポーネントテストライブラリとJavascriptのテストライブラリを組み合わせて行います。

今回は公式が推奨している下記のライブラリを利用します。

https://v3.ja.vuejs.org/guide/testing.html

Vue Test Utils

Vue公式単体テストライブラリであるVue Test Utilsを使ってテストコードを書きます

Jest

Meta(Facebook)社によって開発されたJavaScriptテストフレームワーク

Vue Test Utilsで書いたテストコードをJestで実行します

環境構築

自動設定

vue cliで作成したプロジェクトであれば以下のコマンドで必要なパッケージ、設定を自動で行ってくれます

手動で設定

手動で追加する場合はVueバージョンによって必要なパッケージのバージョンも異なるので注意してください

今回はVue3を対象としています。

  • VueTestUtilsをインストール

  • Jestをインストール

  • Jestがvueファイルを扱えるようにvue-jestをインストール

  • JestがES moduleを扱えるようにbabel-jestをインストール

  • 設定の追加

必要なパッケージはインストールできたので、package.jsonに設定を追加します

  • testEnvironment
    • 実行環境をnodeからブラウザ環境へ変更するため
  • moduleFileExtensions
    • テスト対象のフィアルの拡張子
  • moduleNameMapper
    • importで@を/srcのエイリアスとして設定
  • transform
    • JestがBabelとVueファイルを扱うための設定

テストコードの実装例

下記がテスト対象のコンポーネントです

tests/unitディレクトリ内の.spec.jsファイルがテストの対象となります

mountメソッドへテスト対象となるコンポーネントを渡すことで、コンポーネントをラップしたWrapperオブジェクトが作成され、このWrapperオブジェクトを使ってコンポーネントのテストコードを書いて、Jestでテストを実行します。

下記ではコンポーネントが描画したHTMLに<span class=”count”>0</span>が含まれているか検証しています

イベントトリガー

ユーザーの入力イベントはtriggerを使いイベントを発火させます

下記ではボタンクリックを実行しています

data,propsの更新

setData メソッドまたは setProps メソッドを使って、コンポーネントの状態を操作することができます

また、下記のようにwrapper.vmからインスタンスのプロパティーやメソッドにアクセスすることができます

ルーティングのテスト

ルーティングによる遷移のテストなど、複数のコンポーネントが関係するテストはユニットテストでは扱えず、

VueRouterの機能に依存するコンポーネントについてのテストを扱います($routeや$routerなど)

例えばコンポーネントで$routeのparamsから情報を取得する場合

global.mocksマウントオプションを使用することで、コンポーネントへ$routeを渡すことができます

Vuexのテスト

Vuexを使用してコンポーネントをテストするにはglobal.pluginsマウントオプションを使用してvuexのストアをインストールすることで可能になります

下記の例ではボタンクリックでストアのcountをIncrementさせるコンポーネントをテストしています

テストコードからストアを直接更新することも可能です

HTTPリクエストのテスト

以下のコンポーネントは外部APIにHTTPリクエストを行い、取得したデータをpostsとしてレンダリングしています

HTTPリクエストをテストするにはjest.mock関数でモジュールをモックします

下記の例ではaxiosモジュールのモックを作成し、get関数ではダミーデータを返却します

テストコードの実行中はaxiosは常にモックが呼ばれるので、例えばVuexのactionで呼ばれていたとしてもモックが呼ばれることになります

まとめ

以上がVueJSのユニットテストのまとめになります。

基本的にはWrapperを使ってコンポーネントを操作し、Jestで検証するといった形になります。

ユニットテストは必要性を感じつつも導入が難しそう、テストコードを書くのが難しそうといった理由で後回しになりがちですが、導入はVueCLIを使っていればかなり簡単で、テストコードに関してもHTTPリクエストやVuexを使っているコンポーネントのテストは難しそうなイメージがありましたが、テストツールでサポートされているので特に難しいことはありませんでした。

参考

 

 

 

y.harada

y.harada

Unityエンジニア
Reactが好き