2016-11-30 11 views
3

私は、Angularのインメモリデータサービスから提供される偽のhttpバックエンドを使用するサービスの単体テストを試みています。Promiseを返すAngular 2サービスのテスト

describe('getCars() method ',() => { 
     it('should return a resolved Promise', inject([DataService], (service: DataService) => { 
     service.getCars().then((value) => { 
      expect(value.length).toBe(3); 
     }); 
    })); 
    }); 

問題は私が原因で機能がどのように機能するかを注射で、非同期service.getCars()コールを処理するためにジャスミンの行わコールバックを使用することはできませんです。これは、関連するコードです。私はasyncのテストヘルパーを使用することはできません。これは、約束事では動作しないためです。だから私は解決する約束を待つ方法を知りません---テストはちょうどに達することなく実行されます。を期待してください。

答えて

1

asyncを使用してゾーンをラップし、すべての非同期タスクが完了してからテストが完了するまで待機します。

import { async } from '@angular/core/testing'; 

            // !!!!!!! 
it('should return a resolved Promise', async(inject([DataService], (service: DataService)=>{ 
    service.getCars().then((value) => { 
    expect(value.length).toBe(3); 
    }); 
}))); 

また別のオプションは、injectをまったく使用しないことです。 TestBedからサービスを受けることができます。それはたくさんcleaer injectため

let service: DataService; 

beforeEach(() => { 
    const injector = TestBed.configureTestingModule({}); 
    service = injector.get(DataService); 
}); 

不要だし、それははるかに少ない冗長です。 doneを使用できるようになりました。または、必要に応じて角度の方法で行い、asyncを使用します。

参照:

+0

方法テストベッドからサービスを取得して、おかげで動作します。しかし、私が非同期ソリューションを試してみると、カルマテストランナーは「非同期ゾーンテスト内からsetIntervalを使用できない」というエラーを表示します。 –

+1

ええ、あなたが明示的にsetIntervalを使用しているか、Observable.delayが使用しています。 'async'では使用できません。あなたは 'fakeAsync'でもそれを使うことができます。 「参照」のリンクも参照してください。 'fakeAsync'の使い方を示しています。 –

関連する問題