Nuxt.js で Jest を利用したテストを実装する際にエンカウントしたワーニングやエラーの対処法メモ
なんかタイトル日本語でOK状態だけど、つまりそういうこと。
Jest でテストを書いていたのだけど、いろいろぶち当たったので都度メモしていく。
[Vue warn]: Unknown custom element: <nuxt-link> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
Nuxt で作られたプロジェクトにおいて Jest を利用してテストをする際、下記の様な [Vue warn] が出てしまう。
console.error node_modules/vue/dist/vue.runtime.common.dev.js:621 [Vue warn]: Unknown custom element: <nuxt-link> - did you register the component correctly? For recursive components, make sure to provide the "name" option. found in ---> <Anonymous> <Root>
原因はいまいちわからないのだけど、 <nuxt-link>
を <a>
にレンダリングしてくれないから的なサムシング。
そこで、 RouterLinkStub
を使えば解決できそうな感じが公式にあった。
つまり、
import { mount } from '@vue/test-utils' import TheHeader from '@/components/sections/TheHeader.vue' describe('components/sections/TheHeader.vue', () => { describe('template', () => { test('template test', () => { const wrapper = mount(TheHeader) expect(wrapper.contains('header')).toBe(true) }) }) })
といったテストがあったとして、
import { mount, RouterLinkStub } from '@vue/test-utils' import TheHeader from '@/components/sections/TheHeader.vue' describe('components/sections/TheHeader.vue', () => { describe('template', () => { test('template test', () => { const wrapper = mount(TheHeader, { stubs: { NuxtLink: RouterLinkStub }}) expect(wrapper.contains('header')).toBe(true) }) }) })
のように修正すればOK。
<nuxt-link>
のスタブを用意して上げる感じか。
こちらが大変参考になった。ありがとうございました。
[Vue warn]: Unknown custom element: <no-ssr> - did you register the component correctly? For recursive components, make sure to provide the "name" option.
しかし、今度は <no-ssr>
についてもスタブが必要となってくる。
まったくイメージわかないのでいろいろ調べていたら、こちらに行き当たった。
どうやら jest の setup に下記の様なスクリプトを書いてあげれば良さそう。
spec/util/jest.setup.js
import VueTestUtils from '@vue/test-utils'; Vue.config.silent = true; // Mock Nuxt components VueTestUtils.config.stubs['no-ssr'] = '<span><slot /></span>';
package.json
には setupFiles
を追加
・・・ "jest": { "setupFiles": [ "<rootDir>/spec/unit/jest.setup.js" ], ・・・ }, ・・・
これで <no-ssr>
の [Vue warn]
も出なくなった。
すべて jest.setup.js
にまとめる
RouterLinkStub
を使わなくても jest.setup.js
に <nuxt-link>
のスタブを追加すればよいのではないか?
つまり、
import VueTestUtils from '@vue/test-utils'; // Mock Nuxt components VueTestUtils.config.stubs['nuxt-link'] = '<a><slot /></a>'; VueTestUtils.config.stubs['no-ssr'] = '<span><slot /></span>';
このように任意のスタブを追加していく。
せっかくなので、 <nuxt-link>
は RouterLinkStub
を使おう。
一応これでWARNは出なくなったけど、 <nuxt-link>
は RouterLinkStub
を使いたい。
なので、最終的に spec/util/jest.setup.js
はこのようになった。
import VueTestUtils from '@vue/test-utils'; // Mock Nuxt components VueTestUtils.config.stubs['nuxt-link'] = VueTestUtils.RouterLinkStub; VueTestUtils.config.stubs['no-ssr'] = '<span><slot /></span>';
他にも VueTestUtilsでてこないのかな。なんか思いついたらプルリク送りたい気もする。
router を利用する場合?
Page Component ではなく、部品として作成した Component のテストにて、routerが見つけられずこんなエラーが出た場合は、
TypeError: Cannot read property 'fullPath' of undefined
下記の通りに修正すればOK。
props はどうするの?
mount
のところに仕込んであげれば良い。
import { mount } from '@vue/test-utils' import TheHeader from '@/components/sections/TheHeader.vue' describe('components/sections/TheHeader.vue', () => { describe('template', () => { test('template test', () => { const wrapper = mount(TheHeader, { props: hogehoge: { name: "hogehoge" } }) expect(wrapper.contains('header')).toBe(true) }) }) })
んー、きりがないので一旦このくらいにしておこうかなw