2017-09-10 22 views
0

在我Vue.js項目中,我有以下Vuex行動:測試Vuex行動調用外部API

import { HTTP } from '@/services/http' 

export const actions = { 
    loginUser ({ commit }, params) { 
    HTTP.post(
     'v1/login', 
     { email: params.email, password: params.password } 
    ).then(response => { 
     localStorage.setItem('access_token', response.data.token) 
     commit('SET_USER', response.data) 
    }).catch(error => { 
     commit('SET_LOGIN_ERROR', error.response.data.error) 
    }) 
    } 
} 

我使用摩卡+噶單元測試。我該如何測試該操作?

+0

在我們進入這究竟是爲什麼甚至懶得這樣做呢?如果您依賴於外部API調用,那麼您可能會懷疑測試的真實可靠性和獨立性。從那個電話中嘲笑你需要的東西不是更好嗎? –

回答

1

重要的是你嘲笑/殘留任何依賴關係。您的第一個挑戰是嘲笑HTTP服務,因爲按照書面,您的測試不會通過,除非您有互聯網連接到後端服務器。看看dependency injection解決這個問題。

爲了測試動作,我借用了Vuex's suggestion的想法。創建一個commit函數的存根,該函數接受操作調用的每個突變的類型和有效負載,然後將其與期望值進行比較。如果預期突變的列表與突變列表相匹配,則在執行操作時調用stub,則操作通過測試。

這是一個簡單的例子,我不會在生產中使用,但它有助於說明這個想法:

let count = 0 
let errors = [] 
let mutations = [ 
    { type: 'SET_USER', payload: 'whatever response.data is expected to be' } 
] 

function commit(type, payload) { 
    const mutation = mutations[count] 

    try { 
    expect(mutation.type).to.equal(type) 
    if (payload) { expect(mutation.payload).to.deep.equal(payload) } 
    } catch (error) { 
    errors.push(error) 
    } 

    count++ 
} 

actions.loginUser({ commit }, { email: '[email protected]', password: '12345' })