# コンポーネントをレンダーする二つのメソッド - mountとshallowMount
vue-test-utilsは、 コンポーネントをレンダー(マウント)するのに、二つのメソッドを提供しています - mountとshallowMount。どのコンポーネントも、この二つのいずれかのメソッドを使い、wrapperを返します。wrapperは、Vue componentを含むオブジェクトです。また、テストの実行に色々な便利なメソッドを持っています。
それでは、ChildとParent、二つシンプルなコンポーネントで例を見てみましょう:
const Child = Vue.component("Child", { name: "Child", template: "<div>Child component</div>" }) const Parent = Vue.component("Parent", { name: "Parent", template: "<div><child /></div>" }) Childをレンダーし、vue-test-utilsが提供するメソッドhtmlを呼び出し、出力しましょう。
const shallowWrapper = shallowMount(Child) const mountWrapper = mount(Child) console.log(shallowWrapper.html()) console.log(mountWrapper.html()) mountWrapper.html()とshallowWrapper.html()、両方も下記のように出力されます。
<div>Child component</div> 特に差がありません。では、Parentの場合はどうなるでしょうか?
const shallowWrapper = shallowMount(Parent) const mountWrapper = mount(Parent) console.log(shallowWrapper.html()) console.log(mountWrapper.html()) mountWrapper.html()は下記のように出力されます:
<div><div>Child component</div></div> Parent とChildのマークアップはそのまま出力されます。
その一方、shallowWrapper.html()は下記のようになります。
<div><vuecomponent-stub></vuecomponent-stub></div> <Child />は<vuecomponent-stub />になっています。shallowMount は通常のhtml要素をレンダーしますが、Vue componentsに対しては描画せずスタブに置き換えることが分かりました。
スタブとは、実際のオブジェクトを代替する「偽物」のオブジェクトです。
スタブは便利そうですね。以下のApp.vueコンポーネントをテストすることを考えましょう:
<template> <h1>My Vue App</h1> <fetch-data /> </template> <h1>My Vue App</h1>が正確にレンダーされたかテストしたいとします。ただ、<fetch-data />子コンポーネントもあるので、これはmountedライフサイクルフックの中に、外部APIにリクエストを投げて、レンダーされます。
mountを使った場合、ただ一部の内容だけレンダーしたいとしても、<fetch-data />は外部APIにリクエストを投げます。その結果、テストが遅くなり、エラーも発生しやすくなります。shallowMountを使った場合ですと、<fetch-data />は<vuecomponent-stub />に置き換えます。スタブは外部依存しないため、APIは呼ばれない。テストがより早くできます。