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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Vue.js

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

JavaScript

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

Q&A

解決済

2回答

896閲覧

Vue.js で methods のユニットテストを行いたい

1ntegrale9

総合スコア98

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

Vue.js

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

JavaScript

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

0グッド

3クリップ

投稿2018/01/05 10:51

編集2018/01/09 06:44

###前提・実現したいこと
Vueコンポーネント内のmethodsのユニットテストを行おうとしています。

electron-vue というボイラープレートを使用したアプリケーションを構築しています。
Karma, Chai, Mochaによって自動テストを実行しています。

###発生している問題・エラーメッセージ

自動テストを実行すると、

Target.vue ✗ methods unit test TypeError: _Target2.default.test is not a function at Context.it (webpack:///test/unit/specs/Target.spec.js:9:18 <- index.js:22935:29)

というエラーメッセージが発生します。
レンダリングと参照は問題なさそうなのですが、
test()が関数ではないと言われており、その原因が分かりません。

###該当のソースコード

テストしたいVueコンポーネント(Target.vue)とメソッド(test)

vue

1<script> 2 export default { 3 methods: { 4 test () { 5 return 'test' 6 }, 7 } 8 } 9</script>

テストコード(Target.spec.js)

vue

1import Vue from 'vue' 2import Target from '@/components/Target' 3 4describe('Upload.vue', () => { 5 it('methods unit test', () => { 6 const vm = new Vue(Target).$mount() 7 expect(vm.test()).toBe('test') 8 }) 9})

###試したこと

Vue.jsのユニットテストとして紹介されているような、
以下のサンプルは問題なくテストをパスします。

vue

1import Vue from 'vue' 2import Target from '@/components/Target' 3 4describe('Target.vue', () => { 5 it('should render correct contents', () => { 6 const vm = new Vue({ 7 el: document.createElement('div'), 8 render: h => h(Target) 9 }).$mount() 10 11 expect(vm.$el.querySelector('.title').textContent).to.contain('sample text') 12 }) 13})

指定の方法がおかしいのかと思い、以下のパターンを試しました。

vm.test()ではなくvm.methods.test()としてみるパターン

vue

1expect(vm.methods.test()).toBe('test')

vm.test()ではなくvm.default.test()としてみるパターン

vue

1expect(vm.default.test()).toBe('test')

new Vueせず直接Target.test()としてみるパターン

vue

1expect(Target.test()).toBe('test')

また、以下の記事を参考にして試行錯誤を行いました。

ユニットテスト · electron-vue
単体テスト — Vue.js
モックを使用したテスト · vue-loader
Vue.js Vueコンポーネントのユニットテストを書いてみよう - Qiita
Vueコンポーネントのユニットテスト - SSSSLIDE
Vue.js の 単体テストについて、webpackなどビルドツールがない状況での環境を構築する - Qiita
vue-test-utilsでvuexモジュールのテストを書く - Qiita
Vuexの状態を包括的にテストする - Qiita

###補足情報(言語/FW/ツール等のバージョンなど)
ライブラリ等は全て最新のものを使用しています。

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

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

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

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

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

guest

回答2

0

自己解決

以下の点に留意することで無事にテストが通りました。

vm.methods.test()でもなくvm.default.test()でもなく
vm.test()を指定するのが正解でした。

toBe()という関数は対応しておらず、
equals()という関数を使用する必要がありました。

結果的に以下のコードでテストを通りました。

import Vue from 'vue' import Target from '@/components/Target' describe('Upload.vue', () => { it('methods unit test', () => { const vm = new Vue(Target).$mount() expect(vm.test()).equals('test') }) })

投稿2018/01/09 06:56

1ntegrale9

総合スコア98

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

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

0

js

1 const vm = new Vue(Target).$mount()

ではなくサンプルの通り

js

1 const vm = new Vue({ 2 el: document.createElement('div'), 3 render: h => h(Target) 4 }).$mount()

とすればいいのではないでしょうか。

投稿2018/01/05 18:52

karamarimo

総合スコア2551

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

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

1ntegrale9

2018/01/09 01:09 編集

回答ありがとうございます。 そのように変更したところ、 expect(vm.test()).toBe('test') という指定で Target.vue ✗ methods unit test TypeError: vm.test is not a function at Context.it (webpack:///test/unit/specs/Target.spec.js:11:14 <- index.js:22937:15) というエラーメッセージとなりました。 expect(vm.default.test()).toBe('test') という指定の場合、 Upload.vue ✗ methods unit test TypeError: Cannot read property 'test' of undefined at Context.it (webpack:///test/unit/specs/Upload.spec.js:11:22 <- index.js:22937:22) というようにundefinedとなるので、 レンダリング自体はそちらの方法でも、元の方法でも問題ないようです。
karamarimo

2018/01/09 06:01

vm.default とはなんでしょうか? https://vuejs.org/v2/api/#methods 「Methods to be mixed into the Vue instance. You can access these methods directly on the VM instance」とあるので、method は vue instance の直接のプロパティとして呼び出せるはずです。 Target のインポートは正しく出来ていますでしょうか?
1ntegrale9

2018/01/09 06:12

vm.default は、export default の仕様を完全に理解していないために試したもので、 間違った指定であり、vm.test() の指定が正しいことを示すものです。 「試したこと」に示してあるサンプルのテストをパスすることから、 Target のインポートは正しくできていると思われます。
karamarimo

2018/01/09 06:32

質問文にある Target.vue の script は } が1つ足りないですが、それは原因ではないですか?
karamarimo

2018/01/09 06:35

やっぱり私の回答のやり方では無理ですね(vm が Target のインスタンスではないので)。すみません。
1ntegrale9

2018/01/09 06:40

失礼しました、質問用に色々削った際に余計に削っていました。(修正しました) 元々は存在し、ESLintもエラーを出していないので、それは原因ではないです。 ありがとうございます、他にも色々と模索してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問