用sinonjs捣乱vuex getter

时间:2017-10-16 13:08:09

标签: unit-testing vue.js vuejs2 sinon vuex

在我的应用程序中,在我的路由器使用的导航防护装置内,我有一个vuex命名空间的getter来检查身份验证状态。如果用户已通过身份验证,则getter会执行神奇的底层检查。

我想编写一个简单的单元测试,检查重定向是否根据经过身份验证的状态完成。我一直坚持扼杀吸气剂。

我的吸气者如下:

isAuthenticated (state) {
  return state.token !== null
}

我的身份验证模块如下:

export default {
    namespaced: true,
    state,
    getters
}

我的商店如下:

export default new Vuex.Store({
    modules: {
        authentication
     }
})

我的导航卫士是:

import store from '@/store'

export default (to, from, next) => {
  if (store.getters['authentication/isAuthenticated']) {
    next()
    return
  }

  next({name: 'login'})
}

我已经写过单元测试:

   describe('authenticated-guard.spec.js', () => {
      let authenticatedStub
      beforeEach(() => {
        authenticatedStub = sandbox.stub(store.getters, 'authentication/isAuthenticated')
      })

      afterEach(() => {
        sandbox.restore()
      })

      it('should redirect to login route when the user is not authenticated', () => {
        // Given
        const to = {}
        const from = {}
        const next = spy()
        authenticatedStub.value(false)

        // When
        authenticatedGuard(to, from, next)

        // Then
        assert.ok(next.calledWith({name: 'login'}), 'should have redirected to login route')
      })
    })

单元测试会触发以下错误:TypeError: Cannot redefine property: authentication/isAuthenticated

我已尝试使用authenticatedStub.value(false)替代存根,但错误是相同的。 我无法保留吸气剂,以避免在防护测试中存储逻辑。

是否有人能够在组件之外存留任何吸气剂?

此致

1 个答案:

答案 0 :(得分:1)

问题是vuex将getter设置为不可配置的属性,因此无法更改。

存根它们的方法是存根getters对象本身,这样你的测试就可以这样工作:

describe('authenticated-guard.spec.js', () => {
  it('should redirect to', () => {
    const authenticatedStub = sandbox.stub(store, 'getters')
    // Given
    const to = {}
    const from = {}
    const next = spy()
    authenticatedStub.value({
      'authentication/isAuthenticated': false
    })

    // When
    authenticatedGuard(to, from, next)

    // Then
    expect(next.lastCall.args).to.deep.equal([{name: 'login'}], 'login route when the user is not authenticated')

    authenticatedStub.value({
      'authentication/isAuthenticated': true
    })

    authenticatedGuard(to, from, next)

    expect(next.lastCall.args).to.deep.equal([], 'next route when the user is authenticated')
  })
})