質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Jest

Jestは、JavaScriptのテストフレームワークです。設定が不要で、高速且つ安全にテストを開始できます。コードカバレッジを生成できる他、テストスコープ外のオブジェクトを容易にモック化できるなど、豊富な機能によりテストの導入を簡単にします。

Q&A

0回答

2098閲覧

Vue + jest onMountedで取得したデータがレンダリングされない

Hayato1201

総合スコア226

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Jest

Jestは、JavaScriptのテストフレームワークです。設定が不要で、高速且つ安全にテストを開始できます。コードカバレッジを生成できる他、テストスコープ外のオブジェクトを容易にモック化できるなど、豊富な機能によりテストの導入を簡単にします。

0グッド

0クリップ

投稿2021/08/26 14:11

編集2021/08/27 10:51

Vue3 で作っているコンポーネントのテストを書こうとしています。

js

1it('test', () => { 2const wrapper = shallowMount(Target); 3 console.log(wrapper.html()) 4 wrapper.find(".edit-button").trigger("click") 5})

下記がテスト対象のコンポーネント(簡略化してます)ですが、上記のようにwrapper.html()を出力した際にv-forの部分が出力されません。そのためtrigger("click")も実行できません。
wrapper.vm.hoge を出力してみるとしっかりとclient.getHoge()で取得した値が取れています。

console.log(wrapper.html())段階ではhogeがnullなのでしょうか?
これはなぜでしょう?

template

1 <div v-for="h in hoge" :key="h"> 2         <button class="edit-button" @click="edit(id)">編集</button> 3  </div> 4

js

1 2 const hoge = ref(null) 3 4 onMounted(async () => { 5 const response = await client.getHoge() 6 hoge.value = response.data.hoge 7 })
<div>{{hoge}}</div> のようにしてもhogeは出力されていなかったので、やはりonMountedでhogeを取得する前のデータでレンダリングされていて、hogeを取得した後にdomが更新されていないのかな?と思いましたが、原因がわかりません。

まとめると、
wrapper.vm.hoge には値が入っているのでonMountedは実行されている事が分かります。
しかしwrapper.html()はそれが反映していない&trigger("click")できない、
という状況です。

こちら解決できる方いましたらお手数ですがご教示いただけますと幸いです。


補足でsetup全体を載せます。メソッドの中身など関係ない部分は一部省略します。

js

1setup() { 2 const router = useRouter() 3 const store = useStore() 4 const hoge = ref(null) 5 6 onMounted(async () => { 7 const response = await client.getHoge() 8 hoge.value = response.data.hoge 9 }) 10 11 const edit = (id) => { 12 console.log("goEdit -> id", id) 13 store.commit('huga/hugaEdit', id) 14 router.push({ name: 'EditPage'}) 15 } 16 17 return { 18 hoge, 19 edit 20 } 21}

ただ、これ一応解決していて、下記のようにテスト側で
wrapper.find(".edit-button").trigger("click")
の前に下記のように一瞬スリープを入れるとdomが更新されるようでした。
しかしなぜこのようにラグがあるのでしょうか・・・
vmの値が更新される→DOM更新となると思うのですが、sleepしないとvmが更新されているのにdomが更新されないというのも変な気がします・・・

js

1const _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 2await _sleep(1); 3wrapper.find(".edit-button").trigger("click")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FKM

2021/08/27 06:18

見当はつくところはあるのですが、コンポーネント全体を見ないとなんとも言えません。 setup全体の提示お願いします。
Hayato1201

2021/08/27 10:52

追記いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問