【備忘】【Vue】【Jest】Vue Test Utilsでテストするための環境を構築する


Vue Test Utilsでテストするための環境構築
(認識等に誤りがあれば、ご指摘お願いいたします)

パッケージインストール

// Jest(テストフレームワーク)をインストール
npm install --save-dev jest

// @vue/test-utils:Vueの単体テストを行うためのライブラリ
// vue-jest:.vueファイルのトランスパイラー(テストファイルで.vueファイルを使用するため)
npm install --save-dev @vue/test-utils vue-jest
// babelモジュール:jsファイルのトランスパイルを行うため
npm install --save-dev babel-jest @babel/core @babel/preset-env babel-core@^7.0.0-bridge.0

Jest設定ファイル

jest.config.js
module.exports = {
  // verboseをtrueにすることで、テストケースごとの結果を出力する。なので、trueを設定しておくのが良い。
  // デフォルトはfalseで、テストファイルごとの結果のみの出力となる(各テストケースの結果は不明)
  verbose: true,

  // Jestがファイル探索するディレクトリを指定する。<rootDir>は、設定ファイルのあるディレクトリを指す。
  // 今回はルートのサブディレクトリである 「srcとspecs」のみがJestのアクセスするファイルとしたいので、下記のように定義する(PJ環境に合わせて適宜変える)
  roots: ["<rootDir>/src/", "<rootDir>/specs/"],

  // Jestが読み込む拡張子を定義
  moduleFileExtensions: ['js', 'vue'],

  // ファイルパスのエイリアスを作成
  // 今回は、<rootDir>/src/ のエイリアスを @ に置き換える設定をしている
  // (.*) にあたる部分が $1 で参照されるので、@/test.vue とすると $1 = test.vue となり、<rootDir>/src/test.vueにアクセスできる
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },

  // ファイルをどのモジュールでトランスパイルするかを設定する
  transform: {
    // .jsファイルをbabel-jestでトランスパイルする
    "^.+\\.js$": "babel-jest",
    // .vueファイルをvue-jestでトランスパイルする
    "^.+\\.vue$": "vue-jest",
  },
}

Babel設定ファイル

babel.config.js
{
  "presets": ["@babel/preset-env"]
}

scriptにtestを追加

package.json
"scripts": {
    "test": "jest"
  }

以上でテストを実行できる

適当にテストファイルを作成する。

/specs/test.js
test('mount a vue component', () => {
    console.log("test")
})

npm run testでテストを実行し、Jestが動けばOK

Vuetifyを使用している場合のユニットテスト

プロジェクトには、vue add vuetify でVuetifyをインストールしたはず。

下記、Vuetifyの公式ページにしたがって、テスト環境を整えた。

セットアップファイルを作成

セットアップファイルを作成した。

specs/setup.js
import Vue from 'vue'
import vuetify from 'vuetify'

Vue.use(vuetify)

(備忘)下記、怪しいので参考程度に。。。

実際は、Vuetifyの公式ページの手順通りにユニットテストの環境構築を進めて、いざテストすると「Vuetifyのモジュールが見つからない」って怒られた。

ここで長い時間はまった。

node_moduleを確認すると、vuetifyがない。
(node_moduleにはないがアプリケーションは動く。テストだと、モジュールが見つからないと言われる)

なので、Vuetifyをアンインストールして、npm install vuetifyで再インストールして、再度テストを実行したところ、動いた。

node_moduleにも、vuetifyがあった。

たしか、最初はvue add vuetifyでvuetifyを入れた気がするがそれが原因?(うる覚え)

もう一度、vue add vuetifyで作ったプロジェクトに対してテストして、同じような現象が起こるかを確認すればいいのだが、確認していません!orz