1
/
5

Vue Routerの単体テストについて

ほとんどのウェッブアプリにルータがあります。なので、ルータのテストは不可欠です。Jest、AvoriazでVueアプリのルータの単体テストが簡単に書けます。ソースコードはこちらです。この前の投稿で作ったテンプートから始めます。最初は、vue-router、avoriaz をインストールします。yarn add vue-router avoriaz --save次に、以下のファイルを作成します。client/Home.vue

<template>
  <div>
    Home
    <router-view></router-view> 
 </div>
</template>
<script>
  export default {
    name: 'Home'
  }
</script>
<style scoped>
</style>

client/User.vue

<template>
  <div>
    {{ $route.params.user }}
  </div>
</template>
<script>
  export default {
    name: 'User'
  }
</script>
<style scoped>
</style>

client/router.js

import VueRouter from 'vue-router'
import Vue from 'vue'
import User from './User.vue'
import Home from './Home.vue'
Vue.use(VueRouter)
const router = new VueRouter({
  routes: [
    {
      path: '/',
      component: Home,
      children: [
        {
          name: 'user',
          path: '/:user',
          component: User
        }
      ]
    }
  ]
})
export default router

client/App.vue

<template>
  <div>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
    name: 'App'
  }
</script>
<style scoped>
</style>

client/index.js

import Vue from 'vue'
import App from './App'
import router from './router'
new Vue({
  el: '#app',
  render: h => h(App),
  router: router,
  template: '<App />',
  components: { App  }
})

User.vueの {{ $route.params.user }}をテストしたいです。/#/Lily というルートにアクセスしたら、Lilyが表示されるはずです。二つの取り組みかたを教えます。一つ目は、ルータをモックします。もう一つは、本当のルータを使います。モックルータ

// UserMockRouter.test.js
import Vue from 'vue'
import {mount} from 'avoriaz'
import User from './User.vue'
describe('User.vue', () => {
  it('should display the $route.user using a mocked route', () => {
    expect.assertions(1)
  const $route = { params: { user: 'Lily' }}
  const wrapper = mount(User, { globals: { $route } })
  expect(wrapper.text().trim()).toBe('Lily')
  })
})

ルータを使わずに、$routeという変数でモックします。本当のルータでテストしたい場合もあります。その場合は、このように書きます。

import Vue from 'vue'
import {mount} from 'avoriaz'
import VueRouter from 'vue-router'
import User from './User.vue'
test('should display the $route.user using a a real router', () => {
  expect.assertions(1)
Vue.use(VueRouter)
const router = new VueRouter({
    routes: [
      {
        name: 'user',
        path: '/:user',
        component: User
      }
    ]
  })
router.push({ name: 'user', params: { user: 'lachlan' } })
const wrapper = mount(User, { router })
  wrapper.update()
expect(wrapper.text().trim()).toBe('lachlan')
})

本当のルータを使いますが、必要な部分だけを定義します。wrapper.update()を呼び出すと、Vue.nextTick()も呼びされて、コンポーネントはまたレンダーします。ソースコード: https://github.com/lmiller1990/vue-webpack-jest-express/tree/mock-router