2016-04-22 9 views
0

Ich muss einen Test schreiben, der setzt Zustand dann testen, um zu sehen, ob stateManagerService aufgerufen wurde. Ich erhalte die Fehlermeldung:Wie man toHaveBeenCalled() für Unit-Tests richtig verwendet?

undefined is not an object (evaluating 'vm.stateManagerService.go')

main.controller.js

export class MainController { 
    constructor($state, stateManagerService) { 
     'ngInject'; 
     this.$state = $state; 
     if($state.current.name === 'main') { 
      stateManagerService.go('list'); 
     } 
    } 

} 

Unit-Test main.controller.spec.js

describe('controllers',() => { 
    let vm; 

    // 
    beforeEach(inject(($controller, $state, stateManagerService) => { 
     vm = $controller('MainController'); 

    })); 

    it('should call stateManagerService when current name is main',()=> { 
     vm.$state.current.name = 'main' 
     console.log(vm.$state.current.name) 
     expect(vm.stateManagerService.go()).toHaveBeenCalled(); 
    }); 

auch (etwas off-topic) I bin immer noch verwirrt, warum dies. $ state = $ state ist erforderlich. Wenn ich es auslasse, bekomme ich eine Fehlermeldung, dass $ state nicht definiert ist.

Update: Nun werden die Fehler immer

Error: spyOn could not find an object to spy upon for go() (line 1887)

TypeError: undefined is not an object (evaluating 'vm.stateManagerService.go')

stateManager.service.js

export class StateManagerService { 
    constructor($state, $stateParams, platformDetectService){ 
     'ngInject'; 
     //deps 
     this.$state = $state; 
     this.$stateParams = $stateParams; 
     this.isMobile = platformDetectService.isMobile; 

     //internal 
     this.lastStateName = null; 
     this.lastStateParams = null; 
    } 

    //storage method for current state 
    go (stateName, params){ 
     this.lastStateParams = this.$stateParams.page; 
     this.lastState = this.$state.current.name.split('.')[1]; 



     let nextState = (this.isMobile) ? 'mobile.' + stateName : 'map.' + stateName; 

     this.$state.go(nextState, params) 
    } 

    //returns last state or list 
    goBack(){ 
     let lastState = this.lastState || 'list', 
      page = this.lastStateParams || null; 

     this.go(lastState, {page}) 
    } 

} 
+0

Dont gewesen vergessen auf 'vm.stateManagerService.go' auszuspionieren von' spyOn (vm.stateManagerService, 'go') ' – kazupooot

+0

Jasmine Dokumentation für ** Spione ** und' .toHaveBeenCalled' - http://jasmine.github.io/2.0/introduction.html#section-Spies ohne Methode Explicity Aufruf –

Antwort

1

Sie müssen sich auf die Funktionszeiger, um zu überprüfen, nicht der Rückgabewert der Funktion.

Es sollte

expect(vm.stateManagerService.go).toHaveBeenCalled(); 

Beachten Sie die Abwesenheit von () um die go

Verwandte Themen