2016-07-30 22 views
0

Ich habe eine seltsame Sache getroffen, wenn ich versuche, einen Dienst zu testen, der gewöhnliches $ q Versprechen zurückbringt. Keine Verheißung, die ich in irgendeinem Test versuche, wird wirklich jemals aufgelöst/zurückgewiesen (spezifischhandler von then werden nicht genannt, Code innerhalb des Versprechens läuft gerade gut). Ich habe sogar versucht, Digest auf einem Root-Scope zu erzwingen, wie einige andere Antworten auf SO nahelegten, ohne Glück.Gefrorenes Versprechen in einem Komponententest

Hier ist eine kleine in sich geschlossene Beispiel:

describe('promise', function(){ 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 500; 
    let q; 

    beforeEach(inject(function($q){ 
    q = $q; 
    })); 

    it('finishes', function(done){ 
    expect(q).toBeDefined(); 
    const promise = q.resolve(); 
    console.log(promise); 
    promise.then(
    () => done(), 
    () => done.fail() 
    ); 
    }); 
}); 

Was muss ich das Versprechen wie erwartet zu tun haben, zu bekommen?

+1

$ q Versprechen sind synchron und müssen nicht 'done' aufgerufen werden. Nur '$ rootScope. $ Digest()' * nach * der Versprechungskette wurde eingerichtet. Bei neueren '' '' '' '' '' '' '' '' wird ein weiterer Digest ausgelöst. – estus

+0

Danke, es geht dir gut (estus, Radek Wyroslak und doge1ord). Ich hatte keine Ahnung, dass $ q Versprechen synchron sind und verdauen, um zu arbeiten. – monnef

Antwort

1

Sie benötigen $ Bereich zu verwenden. $ apply() (oder $ rootScope. $ Digest()) und definieren dann(), bevor sie aufgerufen wird. Ich habe Ihr Beispiel geändert:

describe('promise', function(){ 
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 500; 
    let q; 
    let scope; 

    beforeEach(inject(function($q, $rootScope){ 
    q = $q; 
    scope = $rootScope.$new(); 
    })); 

    it('finishes', function(done){ 
    expect(q).toBeDefined(); 
    const promise = q.resolve(); 
    promise.then(
    () => done(), 
    () => done.fail() 
    ); 
    scope.$apply(); 
    }); 
}); 
2

Ich hoffe dieses Beispiel könnte Ihnen helfen mit $ rootScope. $ Digest() (Ich weiß, Sie haben bereits versucht, verdauen bereits). Ignorieren Sie die Typdeklarationen (wurde mit Typoskript geschrieben)

var service: IService; 
    var $rootScope: ng.IRootScopeService; 
    var $q: ng.IQService; 

    beforeEach(() => { 
     angular.mock.module("app"); 
     angular.mock.inject((
      _$rootScope_: ng.IRootScopeService, 
      _$q_: ng.IQService 
     ) => { 
      // Assign dependecies 
      $q = _$q_; 
      $rootScope = _$rootScope_; 
     }); 

     // Initialize service 
     service = new Service($q); 
    }); 


    it("should call errorCallback",() => { 
     let callback = { 
      errorCallback: function (response: any) { /*empty function */ } 
     }; 

     spyOn(callback, "errorCallback"); 

     service.connect(null) 
      .catch(callback.errorCallback); 

     // Trigger a digest on rootScope (needed for $q implementation) 
     $rootScope.$digest(); 

     expect(callback.errorCallback).toHaveBeenCalled(); 
    }); 
Verwandte Themen