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

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

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

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

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1507閲覧

Javascript(vue.js)のテスト(jest)でstatusの値によって表示されるボタンが変化することをテストしたいです

tenlife

総合スコア70

Vue.js

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

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/12/07 21:15

編集2020/12/09 01:08

Jestを使用してVue.jsのテストを行なっています。

解決したいこと: dataに設定してあるstatusの値によって表示するボタンが変更されることを確認したいです。
期待する形
true -> liked
false -> like

現状: statusの値は変更できるが、ボタンは変更されない。求める挙動と逆になってしまっています。
今の形
true -> like
false -> liked

● LikeTest › statusがtrueだったらLikedボタンが見えること expect(received).toBe(expected) // Object.is equality Expected: "Liked" Received: "Like" 。。。省略 ● LikeTest › statusがfalseだったらLikeボタンが見えること expect(received).toBe(expected) // Object.is equality Expected: "Like" Received: "Liked"

test

1import LikeTest from "../../resources/js/components/like.vue"; 2import { mount } from '@vue/test-utils'; 3 4describe('LikeTest', () => { 5 const wrapper = mount(LikeTest, {propsData: {item_id: 1},}); 6 it('statusがtrueだったらLikedボタンが見えること', () => { 7 wrapper.setData({ status: true }) 8 expect(wrapper.vm.status).toBe(true) 9 expect(wrapper.text()).toBe('Liked') 10 }) 11 12 it('statusがfalseだったらLikeボタンが見えること', () => { 13 wrapper.setData({ status: false }) 14 expect(wrapper.vm.status).toBe(false) 15 expect(wrapper.text()).toBe('Like') 16 }) 17})

component

1<template> 2 <div> 3 <button v-if="status == false" type="button" @click.prevent="like" class="btn btn-outline-warning">Like</button> 4 <button v-else type="button" @click.prevent="like" class="btn btn-warning">Liked</button> 5 </div> 6</template> 7 8<script> 9const axios = require('axios'); 10export default { 11 props: ['item_id'], 12 data() { 13 return { 14 status: false, 15 } 16 }, 17 created() { 18 this.like_check() 19 }, 20 methods: { 21 like_check() { 22 const id = this.item_id 23 const array = ["/items/",id,"/check"]; 24 const path = array.join('') 25 axios.get(path).then(res => { 26 if(res.data == 1) { 27 this.status = true 28 } else { 29 this.status = false 30 } 31 }).catch(function(err) { 32 console.log(err) 33 }) 34 } 35 } 36} 37</script>

試したこと

記載の変更

expect(wrapper.text()).toBe('Liked') ⬇︎下記の変更 expect(wrapper.find('.btn-warning').exists()).toBe(true) expect(wrapper.html()).toContain('<div><button type=\"button\" data-testid=\"like\" class=\"btn btn-outline-warning\">Liked</button></div>')

気になるところ

like_checkメソッドの中でaxiosを使っているのですが、その部分に対する記述も必要なのでしょうか?
console.logで確認したところaxios自体はpending状態で未完了となっていました。ですが、setDataで値を設定しているのでaxiosを通す必要はない?というのが私の考えになります。

どなたかお分かりになる方いましたら、ご教授ください。
よろしくお願い致します。

jest 26.6.3
vue 2.5.17

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
結論
$nextTick()を使う

今回はDomの更新を確認するテストだったので$nextTick()を使う必要がありました。
doneも使用して確実に処理が終わる事を確認します。

アサーションが行われる前に確実に各 Promise が resolve するために done を $nextTick や setTimeout と組み合わせて使うことができます

以下参考リンク
https://vue-test-utils.vuejs.org/ja/guides/#%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B
https://vue-test-utils.vuejs.org/ja/guides/testing-async-components.html
https://vue-test-utils.vuejs.org/ja/api/wrapper/text.html

it('statusがtrueだったらLikedボタンが見えること', done => { wrapper.setData({ status: true }) expect(wrapper.vm.status).toBe(true) return wrapper.vm.$nextTick().then(function() { expect(wrapper.text()).toBe('Liked') done() }) })

いや〜、めっちゃ勉強になりました〜。
やっぱリファレンス読めるようになると強いですね。
もっと読めるようになろ〜。

投稿2020/12/14 21:30

tenlife

総合スコア70

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問