2017-12-19 10 views
1
私は次の関数でpromse機能が

角度jamineテスト約束機能

loadDetail(id) { 
    this.bookingService.getServices(id).then((ret) => { 
     if (ret.result) { 
      this.sevices = ret.payload; 
     } 
    }).catch((error) => {});  
} 

私のテストであることをテストしようとしている

:私は、テストを実行すると、私が取得

it('loadDetail successfully return services.', inject(
    [BookingService], (service: BookingService) => { 
     service.initBooking(); 

     let ret = new returnObj(); 
     ret.result = true; 
     ret.payload = new Array<any>(); 
     ret.payload.push({id: 1, title: "Title 1"}); 
     ret.payload.push({id: 2, title: "Title 2"}); 
     ret.payload.push({id: 3, title: "Title 3"}); 

     const spy = spyOn(service, "getServices").and.returnValue(Promise.resolve(ret)); 

     component.loadDetail(1); 

     expect(component.sevices.length).toEqual(3); 
    } 
)); 

エラー "期待0〜3になります。" ここで何が間違っていますか?私は例を辿り、スパイを正しく使っていると確信しています。

答えて

1

プロビジョニングは非同期であり、結果はloadDetail(1)が完了する前にアサートされるという問題があります。

効率的にテストするためには、非同期関数は常に約束や、観察を返す必要がありますが:

loadDetail(id) { 
    return this.bookingService.getServices(id).... 
} 

それが結果を返すことを想定されていない場合、それはundefinedの約束になります。

この方法で、チェーン接続することができます。これはasync..awaitasyncまたはfakeAsync角度ヘルパーに特に有用である:

it('loadDetail successfully return services.', fakeAsync(inject(
    [BookingService], async (service: BookingService) => { 
     ... 
     const spy = spyOn(service, "getServices").and.returnValue(Promise.resolve(ret)); 

     await component.loadDetail(1); 

     expect(component.sevices.length).toEqual(3); 
    } 
)); 

また、これは(これは本当のHTTPのような真の非同期操作では動作しません同期的に非同期コードをテストするためにfakeAsynctickヘルパーで解決することができますリクエスト):

it('loadDetail successfully return services.', fakeAsync(inject(
    [BookingService], (service: BookingService) => { 
     ... 
     const spy = spyOn(service, "getServices").and.returnValue(Promise.resolve(ret)); 

     component.loadDetail(1); 
     tick(0); // promise chain was executed 

     expect(component.sevices.length).toEqual(3); 
    } 
));