API
Vue Testing Library
は DOM Testing Library
からすべてを再エクスポートします。
また、これらのメソッドも公開しています。
render(Component, options)
render
関数は、Vue Testing Libraryでコンポーネントをレンダリングする唯一の方法です。
最大2つのパラメータを受け取り、いくつかのヘルパーメソッドを持つオブジェクトを返します。
function render(Component, options) {
return {
...DOMTestingLibraryQueries,
container,
baseElement,
debug(element),
unmount,
html,
emitted,
rerender(props),
}
}
パラメータ
Component
テスト対象の有効なVueコンポーネント。
Options
@vue/test-utils
mount に渡される追加情報を格納したオブジェクト。
さらに、以下のオプションも提供できます。
store
(Object
| Store
)
Vuex ストア のオブジェクト定義。store
オブジェクトが提供されると、Vue Testing Library
は Vuex ストアをインポートして設定します。インスタンス化された Vuex ストアを渡すと、それが使用されます。
routes
(Array
| VueRouter
)
Vue Router のルートのセット。routes
が提供されると、ライブラリは Vue Router をインポートして設定します。インスタンス化された Vue Router を渡すと、それが使用されます。
props
(Object
)
propsData
とマージされます。
container
(HTMLElement
)
デフォルトでは、Vue Testing Library
は div
を作成し、baseElement
に追加します。ここにコンポーネントがレンダリングされます。このオプションで独自の HTMLElement
コンテナを提供すると、baseElement
に自動的に追加されません。
例:tablebody
要素の単体テストを行う場合、div
の子要素にすることはできません。この場合、レンダリングcontainer
としてtable
を指定できます。
const table = document.createElement('table')
const {container} = render(TableBody, {
props,
container: document.body.appendChild(table),
})
baseElement
(HTMLElement
)
container
が指定されている場合、これはデフォルトでそれに設定されます。それ以外の場合は、デフォルトで document.body
になります。baseElement
は、クエリの基本要素として、また debug()
を使用したときに表示されるものとして使用されます。
render
の結果
render
メソッドは、いくつかのプロパティを持つオブジェクトを返します。
...queries
render
の最も重要な機能は、DOM Testing Library のクエリが、最初の引数が baseElement (デフォルトは document.body
)にバインドされて自動的に返されることです。
クエリ を参照して、完全なリストを確認してください。
const {getByLabelText, queryAllByTestId} = render(Component)
container
レンダリングされたVueコンポーネントを含むDOMノード。デフォルトではdiv
です。これは通常のDOMノードなので、container.querySelector
などを呼び出して子要素を検査できます。
ヒント:レンダリングされた要素のルート要素を取得するには、
container.firstChild
を使用します。
🚨 レンダリングされた要素のクエリに
container
を使用している場合は、再考する必要があります!他のクエリは、テスト対象のコンポーネントに加えられる変更に対してより柔軟性があります。要素のクエリにはcontainer
を使用しないでください!
baseElement
container
内でVueコンポーネントがレンダリングされるDOMノード。render
のオプションでbaseElement
を指定しない場合、デフォルトはdocument.body
になります。
これは、テスト対象のコンポーネントがコンテナdiv
の外側に何かをレンダリングする場合(たとえば、本文に直接HTMLをレンダリングするポータルコンポーネントのスナップショットテストを行う場合)に役立ちます。
注:
render
によって返されるクエリはbaseElement
を調べます。そのため、baseElement
を使用せずにポータルコンポーネントをテストするためにクエリを使用できます。
debug(element)
このメソッドは、console.log(prettyDOM(element))
のショートカットです。
import {render} from '@testing-library/vue'
const HelloWorldComponent = {
template: `<h1>Hello World</h1>`,
}
const {debug} = render(HelloWorldComponent)
debug()
// <div>
// <h1>Hello World</h1>
// </div>
これは、公開されているprettyDOM
(DOM Testing Library
からも提供されます)をラップしたシンプルなラッパーです。
unmount()
@vue/test-utils
destroy のエイリアスです。
html()
@vue/test-utils
html のエイリアスです。
emitted()
@vue/test-utils
emitted のエイリアスです。
rerender(props)
@vue/test-utils
setProps のエイリアスです。
Promise を返すため、await rerender(...)
を使用できます。
fireEvent
Vue は再レンダリング中に非同期的に DOM 更新を適用するため、fireEvent ツールは async
関数として再エクスポートされます。テストでイベントに応答して DOM が正しく更新されるようにするには、常に await
fireEvent
を使用することをお勧めします。
await fireEvent.click(getByText('Click me'))
さらに、Vue Testing Library は 2 つの便利なメソッドを公開しています。
touch(elem)
focus()
と blur()
イベントの両方をトリガーします。
await fireEvent.touch(getByLabelText('username'))
// Same as:
await fireEvent.focus(getByLabelText('username'))
await fireEvent.blur(getByLabelText('username'))
update(elem, value)
v-model
で制御される入力を適切に処理します。入力/選択/テキストエリアの内部値を更新し、適切なネイティブイベントを発行します。
update
の動作例については、v-model の例テスト を参照してください。
cleanup
render でマウントされた Vue ツリーをアンマウントします。
テストフレームワーク(mocha、Jest、Jasmineなど)がグローバルな
afterEach()
関数をテスト環境に注入した場合、これは自動的に呼び出されます。そうでない場合は、各テストの後にcleanup()
を呼び出す必要があります。
render
を呼び出したときにcleanup
を呼び出さないと、メモリリークやべき等でないテスト(テストでデバッグが困難なエラーにつながる可能性があります)が発生する可能性があります。