サイトアイコン 上尾市のWEBプログラマーによるブログ

「これからはじめるVue.js実践入門」の感想・備忘録8

「これからはじめるVue.js実践入門」の感想・備忘録7の続き

テスト

単体テスト

Jestの準備

1. Vue CLIのJestプラグインの導入
2. テストコード作成
describe('Jestの基本', () => {
  beforeEach(()=>
    console.log(new Date().toLocaleString())
  )
  it('初めてのテスト', () => {
    expect(1+1).toBe(2);
  })
})
3. テスト実行

Matcher

コンポーネントのテスト

import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'

describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message'
    const wrapper = shallowMount(HelloWorld, {
      propsData: { msg }
    })
    expect(wrapper.text()).toMatch(msg)
  })
})
  1. shallowMountメソッドとテスト対象コンポーネントのインポートを行う。
  2. shallowMountでコンポーネントを描画(マウント)する。
    • 第2引数にpropsData,attrsなどを渡す。
    • 戻り値のWrapperインスタンスはコンポーネントを取得・テストするためのメソッドを持っている。
      https://v1.test-utils.vuejs.org/ja/api/wrapper/
      セレクタで要素を指定できるfind, findAllメソッドがよく使われる。
      • h1のテキストを取得: wrapper.find('h1').text()
      • テキストボックスに入力: wrapper.find('#name').setValue('abc')
      • フォーム送信: wrapper.find('form').trigger('submit.prevent')
    • setPropsメソッドを使うと、マウントした後でもプロパティを変更することができる。
      await wrapper.setProps({msg: 'ほげ'})
      ※関数をasync () => {とする必要あり

mountメソッドとshallowMountメソッド

<template>
  <HogeHoge></HogeHoge>
</template>
<template>
  <h2>HogeHoge</h2>
</template>
import { shallowMount, mount } from '@vue/test-utils'
// 〜省略〜
const wrapper1 = shallowMount(App)
const wrapper2 = mount(App)
console.log(wrapper1.html()); // <hogehoge-stub></hogehoge-stub>
console.log(wrapper2.html()); // <h2>HogeHoge</h2>

算出プロパティのテスト

data: function () {
  return {
    name: ''
  }
},
computed: {
  hoge() {
    return this.name.toLowerCase()
  }
}
Vuexを使っている場合
import { shallowMount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import App from '@/App.vue'
import store from '@/store/index'

const localVue = createLocalVue()
localVue.use(Vuex)
// 〜省略〜
const wrapper = shallowMount(App, {store, localVue})
expect(wrapper.vm.count1).toBe(0)

E2Eテスト

E2Eテストとは

Nightwatch

module.exports = {
  'default e2e tests': browser => {
    browser
      .init()
      .waitForElementVisible('#app')
      .assert.elementPresent('.hello')
      .assert.containsText('h1', 'Welcome to Your Vue.js App')
      .assert.elementCount('img', 1)
      .end()
  },
}
モバイルバージョンを終了