VitestでVueコンポーネントをテストする
コンポーネントテストとなるとまたハードルが上がる
関連記事:
JestをES6化してimport/exportを使う方法
vite版JestことVitestでユニットテスト
Vitestを使い出したがなかなか良い感じ。
ガシガシテストしていきたいが、
VueJSをテストする際、ハードルになる点がいくつかある。
その一つがコンポーネントのテストだ。
コンポーネントをVueとして登録して使用しないと、
本来の機能と食い違った動きをしてしまう。
そこで今回はViteを使いつつ、
Vueのテストツールを使ってコンポーネントのテストをしてみる。
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
Vue.jsとViteをインストール
適当なディレクトリにvueをインストールする。
今回はcreate-viteからプロジェクトを作成する。
プロジェクト名(ディレクトリ名)を comp_test
とする。
npm init vite
Need to install the following packages:
create-vite@4.0.0
Ok to proceed? (y)
✔ Project name: … comp-test
✔ Select a framework: › Vue
✔ Select a variant: › TypeScript
Scaffolding project in ~/comp-test...
Done. Now run:
cd comp-test
npm install
npm run dev
http://localhost:5173/ へアクセス
Hello World
Vitestをインストール
TypeScriptのテストランナーにvitestを使用する。
tests
ディレクトリを作成してそこにテストを格納していく
mkdir tests
npm i -D vitest
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [Vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
test: {
globals: true,
},
} as any)
仮のテストを作成
import HelloWorld from "@/components/HelloWorld.vue";
import {beforeEach, describe, expect, test} from "vitest";
describe("HelloWorld", () => {
test("hello world", async () => {
expect("HelloWorld").toBe(HelloWorld.__name)
})
})
テスト実行
npx vitest run
✓ tests/HelloWorld.test.ts (1)
Test Files 1 passed (1)
Tests 1 passed (1)
Start at 14:00:47
Duration 3.06s (transform 1.76s, setup 0ms, collect 371ms, tests 7ms)
(・ω・) 問題なし!
Vue Test Utilsをインストール
Vueのテストサポートツールである @vue/test-utils
をインストール。
npm i -D @vue/test-utils
テスト対象の HelloWorld.vue
は、
msg値をpropとして引き取り、
html上に反映する仕様のようなので、
設定値がHTML上に表示されているかを確認するテストをする。
<HelloWorld msg="new message" />
コンポーネントのテストを追加で実装する。
import HelloWorld from "@/components/HelloWorld.vue";
import {beforeEach, describe, expect, test} from "vitest";
import {shallowMount} from "@vue/test-utils";
describe("HelloWorld", () => {
test("hello world", async () => {
expect("HelloWorld").toBe(HelloWorld.__name)
})
test("Component Test", async () => {
const expected = "test message";
const wrapper = shallowMount(HelloWorld, {
propsData: { msg:expected },
})
expect(wrapper.text()).toContain(expected)
})
})
テストを実行する。
npx vitest run
RUN v0.25.6 ~/comp-test
✓ tests/HelloWorld.test.ts (2)
Test Files 1 passed (1)
Tests 2 passed (2)
Start at 15:18:35
Duration 1.88s (transform 947ms, setup 0ms, collect 277ms, tests 22ms)
(・∀・) テスト成功!
------------------- ↓ 後書きはここから ↓-------------------
参考:
Discussion