2017-12-19 4 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 각도 도우미에 특히 유용합니다 :

이것은 또한 동기 방식 비동기 코드 (이 실제 HTTP와 같은 진정한 비동기 작업 작동하지 않습니다을 테스트 fakeAsynctick 도우미로 해결 될 수
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); 
    } 
)); 

요청) :

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