首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点/vue.js单元测试承诺,如何正确编写它?

节点/vue.js单元测试承诺,如何正确编写它?
EN

Stack Overflow用户
提问于 2017-11-04 13:05:37
回答 1查看 313关注 0票数 1

基本上,我正在尝试测试以下的vex/action:

代码语言:javascript
复制
export default {
  login (context, payload) {
    return vueAuthInstance.login(payload.user, payload.requestOptions)
    .then((response) => {
      if (JSON.stringify(response.data) !== '{}') {
        return true
      } else {
        return false
      }
    })
  }
}

其中我有一个依赖的vueAuthInstance,我需要存根/模拟.它正在被调用,它有一个登录函数,包含两个参数,它返回一个带有数据属性的对象(响应)

代码语言:javascript
复制
  vueAuthInstance = {login: sinon.stub().withArgs({email: 'email', password: 'password'}, 'options').return({data: 'user_data_with_token'}) }

我的登录函数实际上就像调用vueAuthInstance存根一样,所以我应该能够编写

代码语言:javascript
复制
actions.login(context, payload).then((response) => {
  expect(response).to.eql(true)
})

但我被锁在写一个正确的测试中

代码语言:javascript
复制
describe('login', () => {
   const payload = {user: {email: 'john.doe@domain.com', password: 'john123'}}
   sinon.stub(vueAuthInstance, 'login').withArgs(payload).returns(true)
   it('should return successful login', () => {
     actions.login(context, payload).then((response) => {
       expect(response).to.eql(true)
     })
   })
 })

我收到一个错误:

代码语言:javascript
复制
 actions.js login
 TypeError: Cannot read property 'then' of undefined

要完成上下文,以下是完整的文件..。

@/services/auth.js =======================

代码语言:javascript
复制
import Vue from 'vue'
import Vuex from 'vuex'
 aimport { VueAuthenticate } from 'vue-authenticate'
import axios from 'axios'

Vue.use(Vuex)
Vue.use(VueAxios, axios)

const vueAuthInstance = new VueAuthenticate(axios, {
  baseUrl: '/'
}) a

export default vueAuthInstance

@/vuex/getters.js =======================

代码语言:javascript
复制
import _ from 'underscore'

export default {
  isAuthenticated: state => state.isAuthenticated,
}

@/vuex/诱变_vuex. =======================

代码语言:javascript
复制
export const IS_AUTHENTICATED = 'isAuthenticated'
export const CURRENT_USER_ID = 'currentUserId'

@/vuex/actions.js =======================

代码语言:javascript
复制
  import { IS_AUTHENTICATED, CURRENT_USER_ID } from './mutation_types'
  import getters from './getters'
  import vueAuthInstance from '@/services/auth.js'

  login (context, payload) {
    payload = payload || {}
    return vueAuthInstance.login(payload.user, payload.requestOptions)
    .then(  login: ({ commit }, payload) => {
      payload = payload || {}
      return vueAuthInstance.login(payload.user, payload.requestOptions)
      .then((response) => {
        // check response user or empty
        if (JSON.stringify(response.data) !== '{}') {
          commit(IS_AUTHENTICATED, { isAuthenticated: true })
          commit(CURRENT_USER_ID, { currentUserId: response.data.id })
          return true
        } else {
          commit(IS_AUTHENTICATED, { isAuthenticated: false })
          commit(CURRENT_USER_ID, { currentUserId: '' })
          return false
        }
     })
   }

/test/unit/specs/vuex/actions.js =======================

代码语言:javascript
复制
  describe('login', () => {
    it('should return successful login', () => {
    })
  })

  1/ I must stub or spy my dependency vueAuthInstance
EN

回答 1

Stack Overflow用户

发布于 2017-11-04 17:17:41

正如@Bergi所提到的,返回的对象应该是一个承诺,所以正确的测试是:

代码语言:javascript
复制
      describe('loginUser', () => {
        var sandbox, payload, response
        beforeEach(() => {
          sandbox = sinon.sandbox.create()
        })
        afterEach(() => {
          sandbox.restore()
        })

        it('should return successful login', () => {
          payload = {user: {email: 'john.doe@domain.com', password: 'john123'}, requestOptions: {}}
          response = {data: {id: 1, name: 'John Doe', email: 'john.doe@domain.com', created_at: '2017-11-02T07:56:36.405Z', token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obiBMb2dpbiBEb2UiLCJhZG1pbiI6dHJ1ZX0.VHK2sCbj5nKJ8oC44UTHuhQHXEdPN8zjKjaFT0OZ-L'}}
          sandbox.stub(vueAuthInstance, 'login').withArgs(payload.user, payload.requestOptions).returns(Promise.resolve(response))

          return actions.login(store, payload)
          .then((result) => {
            expect(result).to.eql(true)
            expect(store.commit).to.have.been.calledWith(types.IS_AUTHENTICATED, { isAuthenticated: true })
            expect(store.commit).to.have.been.calledWith(types.CURRENT_USER_ID, { currentUserId: response.data.id })
          })
        })
       it('should return invalid login', () => {
          payload = {user: {email: 'john.doe@domain.com', password: 'john999'}, requestOptions: {}}
          response = {data: {}}
          sandbox.stub(vueAuthInstance, 'login').withArgs(payload.user, payload.requestOptions).returns(Promise.resolve(response))

          return actions.login(store, payload)
          .then((result) => {
            expect(result).to.eql(false)
            expect(store.commit).to.have.been.calledWith(types.IS_AUTHENTICATED, { isAuthenticated: false })
            expect(store.commit).to.have.been.calledWith(types.CURRENT_USER_ID, { currentUserId: '' })
          })
        })
      })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47111059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档