2017-09-10 20 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' })