2016-05-25 18 views
1

Wir sind gerade zu Mokka, Chai und Sinon für unsere Testbibliotheken umgezogen und kommen aus Jasmin Ich bin ein wenig verwirrt, wie man Versprechungen testet.

Ich habe eine Form der Funktion einreichen, das einen Dienst und auf Rückrufe navigiert den Benutzer in dem richtigen Zustand:

submit(event, theForm){ 
    event.preventDefault(); 

    if(theForm.$valid){ 
     this.AuthenticationService.authenticateUser({ 
      email: this.email, 
      password: this.password 
     }).then((result) => { 
      this.$state.go('dashboard.home') 
     }); 
    } 
} 

haben einen Teil des Weges dorthin mit dem folgenden Test bekommen:

it('should submit the login credentials if valid', function(){ 

    var dfd = q.defer(), 
     promise = dfd.promise; 

    controller.email = '[email protected]'; 
    controller.password = 'Password123'; 

    sinon.stub(service, 'authenticateUser').returns(promise); 
    sinon.spy(state, 'go'); 
    sinon.spy(controller, 'submit'); 

    controller.submit(event, theForm); 

    dfd.resolve(); 

    expect(controller.submit).to.have.been.called; 
    expect(controller.submit).to.have.been.calledWith(event, theForm); 
    expect(event.preventDefault).to.have.been.called; 

    expect(service.authenticateUser).to.have.been.called; 
    expect(service.authenticateUser).to.have.been.calledWith({ 
     email: controller.email, 
     password: controller.password 
    }); 
    expect(state.go).to.have.been.called; 
    expect(state.go).to.have.been.calledWith('dashboard.home'); 
}); 

Aber die Behauptung, dass state.go aufgerufen wird, wird nicht bestanden. Was ändere ich an meinem Test, damit er bestanden wird?

+0

Hey @ RyanP13 hast du eine Lösung für das obige Problem gefunden? Ich stehe auch vor dem gleichen Problem. Wenn versucht, Code "authenticateUser" Versprechen zu testen .. –

Antwort

0

Wahrscheinlich ist dies ein Timing-Problem, bei dem Ihre expect() aufgerufen werden, bevor die then() in Ihrem Controller ausgeführt wurde. Um dies zu korrigieren, versuchen Sie state.go Behauptungen in einem finally() wie Einwickeln so:

it('should submit the login credentials if valid', function(){ 

    [...] 

    return promise.finally(function() { 
     expect(state.go).to.have.been.called; 
     expect(state.go).to.have.been.calledWith('dashboard.home'); 
    ); 
}); 

Zwei wichtige Dinge passieren hier:

  1. finally() sorgt dafür, dass Ihre expect() ‚s laufen nicht bis dfd wurde vollständig aufgelöst.
  2. finally() gibt ein Versprechen zurück, das Sie dann zum Mokka-Test selbst zurückgeben. Dies teilt Mocha mit, dass es sich um asynchronen Code handelt und verhindert, dass es zu weiteren Tests weitergeht, bis Ihre expect() ausgeführt wurde. Sie können mehr über die Behandlung von asynchronem Code in Mocha here lesen.