2017-10-16 3 views
5

Auf meiner Anwendung, in einem Navigationsschutz, der von meinem Router verwendet wird, habe ich einen vuex Namespaced Getter, um den Authentifizierungsstatus zu überprüfen. Der Getter überprüft die Magie, ob der Benutzer authentifiziert ist.Stubbing vuex getters mit sinonjs

Ich möchte einen einfachen Komponententest schreiben, der überprüft, ob die Umleitung gemäß dem authentifizierten Zustand erfolgt. Ich stehe darauf, den Getter zu stubben.

Mein Getter ist die folgende:

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

Mein Authentifizierungsmodul ist die folgende:

export default { 
    namespaced: true, 
    state, 
    getters 
} 

Und mein Geschäft ist die folgende:

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

Mein naviguation Wache ist:

import store from '@/store' 

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

    next({name: 'login'}) 
} 

Ich habe geschrieben, dass Unit-Test:

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') 
     }) 
    }) 

Der Unit-Test die folgenden Fehler auslösen: TypeError: Cannot redefine property: authentication/isAuthenticated.

Ich habe als Alternative zu Stub mit authenticatedStub.value(false) versucht, aber der Fehler ist der gleiche. Ich bin nicht in der Lage, den Getter zu stubben, zu vermeiden, Speicherlogiken auf Wachtests zu haben.

Kann jemand Getter außerhalb von Komponenten stubben?

Grüße

Antwort

1

Das Problem ist, dass vuex die Getter als nicht-konfigurierbaren Eigenschaften setzt, so dass sie nicht verändert werden.

Ein Weg, sie zu Stummel ist das getters Objekt selbst so Ihren Test wie dies funktionieren könnte Stummel:

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') 
    }) 
}) 
+0

Dank! Es klappt –