Vue.js 如何在Vuex模块中测试操作?

Vue.js 如何在Vuex模块中测试操作?,vue.js,jestjs,vue-test-utils,Vue.js,Jestjs,Vue Test Utils,我想测试一个名为user的vuex模块 最初,我成功地将模块注册到Vuex。它的工作如预期 // store/index.js import Vue from 'vue' import Vuex from 'vuex' import user from './modules/user' Vue.use(Vuex) const store = new Vuex.Store({ modules: { user } }) export default store 我的用户模块

我想测试一个名为user的vuex模块

最初,我成功地将模块注册到Vuex。它的工作如预期

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'

import user from './modules/user'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    user
  }
})

export default store
我的用户模块定义如下

store/modules/user.js

const state = {
  token: getToken() || '',
}

export const getters = {
  token: state => state.token,
}

const mutations = {
  [SET_TOKEN]: (state, token) => {
    state.token = token
  }
}

const actions = {
  [LOGIN] ({ commit }, body) {
    return new Promise((resolve, reject) => {
      login(body).then(response => { //login is an api method, I'm using axios to call it.
        const { token } = response.data
        setToken(token)
        commit(SET_TOKEN, token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  }
}

export default {
  state,
  getters,
  mutations,
  actions
}
登录api

api/auth.js
import request from '@/utils/request'

export function login (data) {
  return request({
    url: '/auth/login',
    method: 'post',
    data
  })
}
axios请求文件

utils/request
import axios from 'axios'
import store from '@/store'
import { getToken } from '@/utils/auth'

const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_API_URL,
  timeout: 5000
})

request.interceptors.request.use(
  config => {
    const token = getToken()
    if (token) {
      config.headers['Authentication'] = token
    }
    return config
  }
)

export default request
当我想编写一些测试时(使用Jest),例如上面显示的登录操作

// user.spec.js
import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'

import actions from '@/store/modules/user'

const localVue = createLocalVue()
localVue.use(Vuex)

test('huhu', () => {
  expect(true).toBe(true)
  // implementation..
})
如何为登录操作编写测试?谢谢对不起,我的初学者问题

编辑:谢谢Raynhour为我指明了正确的方向:)


存储它只是一个将导出对象的javascript文件。不需要使用vue测试工具

import actions from '../actions'
import flushPromises from 'flush-promises'
jest.mock('../api/auth.js', () => {
  return {
   login: jest.fn()..mockResolvedValue('token')
  }; // mocking API. 

describe('actions', () => {
  test('login should set token', async () => {
    const context = {
      commit: jest.fn()
    }
    const body = {
      login: 'login',
      password: 'password'
    }
    actions.login(context, body)
    await flushPromises() // Flush all pending resolved promise handlers
    expect(context.commit).toHaveBeenCalledWith('set_token', 'token')
  })
})
但您需要记住,在单元测试中,所有异步请求都必须模拟(使用jest.mock或其他方式)

import actions from '../actions'
import flushPromises from 'flush-promises'
jest.mock('../api/auth.js', () => {
  return {
   login: jest.fn()..mockResolvedValue('token')
  }; // mocking API. 

describe('actions', () => {
  test('login should set token', async () => {
    const context = {
      commit: jest.fn()
    }
    const body = {
      login: 'login',
      password: 'password'
    }
    actions.login(context, body)
    await flushPromises() // Flush all pending resolved promise handlers
    expect(context.commit).toHaveBeenCalledWith('set_token', 'token')
  })
})