2016-07-30 6 views
0

通常の$ q約束を返すサービスをテストしようとすると、私は奇妙なことに遭遇しました。どんなテストでも試してみる約束は実際に解決/拒否されています(具体的にはthenからのハンドラは呼び出されず、約束内のコードは正常に実行されます)。私はルートスコープでダイジェストを強制しようとしましたが、何か別の答えが示唆されていたので、運が無かったのです。ここでユニットテストの凍結約束

は小さな自己完結型の例である:

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() 
    ); 
    }); 
}); 

は私が期待通りに約束の仕事を得るために行うためには何がありますか?

+1

$ q約束は同期的で、 'done'を呼び出す必要はありません。 promiseチェーンが確立された後の '$ rootScope。$ digest()' *。新しい 'then'は、別のダイジェストをトリガする必要があります。 – estus

+0

ありがとう、あなたは大丈夫です(エスタス、Radek Wyroslakとdoge1ord)。私は、$ q約束が同期しており、働くためにダイジェストを必要としているということを知らなかった。 – monnef

答えて

1

を型宣言を無視する。$適用されます()(または$ rootScope。$ダイジェスト())と、それを呼び出す前に)(その後、定義しています。私はあなたの例を変更しました:

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

この例が$ rootScope。$ digest()を使用するのを助けてくれることを願っています(私は既にダイジェストを強制しようとしています)。ただ、あなたは$スコープを使用する必要があります(typescriptですを使用して書かれていた)

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(); 
    });