在我的应用程序中,在我的路由器使用的导航防护装置内,我有一个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)
替代存根,但错误是相同的。
我无法保留吸气剂,以避免在防护测试中存储逻辑。
是否有人能够在组件之外存留任何吸气剂?
此致
答案 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')
})
})