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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Q&A

解決済

1回答

906閲覧

nuxtの環境でvuexのテストをするときに$axiosをスタブ化したい

mosmos_21

総合スコア46

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

0グッド

3クリップ

投稿2019/08/20 01:00

編集2019/08/20 01:23

nuxtで作成しているアプリケーションでstoreのテストを書いています。テストライブラリはjestを使用しています。
actionのコード例は以下のとおりです

javascript

1 2export const actions = { 3 async login({ commit }, { id }) { 4 const user = await this.$axios.$get(`/users/${id}`) 5 if (!user) { throw new Error('invalid user') } 6 commit('setUser', { user }) 7 } 8}

ここでactionに対するテストを書くと以下のようになると思います。

javascript

1let store 2beforeEach(() => { 3 store = new Vuex.Store(cloneDeep(index)) 4}) 5test('login', () => { 6 store.dispatch('login', { id: 'foo_bar' }) 7 expect(store.getters['user'].id).toEqual('foo_bar') 8})

このときにthis.$axiosは当然存在しないのでstubを作りたいのですがどのように作ればよいかわかりません。

いくつか調べた中でaxios + MockAdapterを使用する方法は試したのですが、上手く動作しませんでした。

javascipt

1// beforeEachに追加 2store.$axios = axios.create() 3 4// test内に追加 5const mock = new MockAdapter(store.$axios) 6mock.onGet('/users/foo_bar').reply(200, { id: 'foo_bar' })

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/20 01:12

何のテストツールを使用しているか追記したほうが良いと思います。
mosmos_21

2019/08/20 01:23

ご指摘ありがとうございます。追加しました。
退会済みユーザー

退会済みユーザー

2019/08/20 01:33

this.$axiosというのはそもそもどのように注入されているのでしょうか。
mosmos_21

2019/08/20 01:50

触り始めで正確に理解していないのですが、nuxtのmoduleなのでnuxt側がstoreを作る際に自動的に注入されるものという認識です。
guest

回答1

0

ベストアンサー

私はVue/Nuxtの専門家ではありませんが、私見を述べます。

まず this.$axios がいつどのように注入されたのかを理解していないと代わりのオブジェクトを差し込むことができないと思います。
そのため既存のコードを変えたくないのであればこの仕組みに精通しダミーの注入方法を発見する必要があると思います。
それができないのであれば this.$axios は剥がすことができない密結合なオブジェクトということとなりスタブ/モック化しての単体テストは難しいでしょう。
私なら this.$axios の利用自体を慎重に検討します。

少しググって発見した下記の記事ではaxiosをラップする自作の関数を作り、それをテスト時に差し替えているようです。
こちらの方が this.$nuxt よりテスト時の交換が容易そうです。

https://techblog.istyle.co.jp/archives/1397

actionの単体テストを諦めるという方針もあり得るでしょう。
そもそもmutationとactionが別れているのは非同期処理というテストが難しい部分をactionに追い出すという目的があると思います。
mutationを単体テストし、actionについてはサーバを含めたE2Eテストで担保するという方針も十分考えられます。

まとめると採れる選択肢は以下でしょう。

this.$axios がいつ注入されているのかを調査する
this.$axios を使うのを辞め、自分で疎結合な仕組みを導入する
③ mutationのテストのみで妥協し、actionsはE2Eテストで担保する

投稿2019/08/20 02:01

編集2019/08/20 02:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問