2016-11-30 160 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測試助手,因爲它不能與promise一起使用。所以我不知道如何等待承諾解決---測試運行沒有達到期望

回答

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獲得服務。這是很多清潔工

let service: DataService; 

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

不需要inject,它是一個很少詳細。您現在可以使用done。或者如果你願意,仍然以角度的方式去做,並使用async

參見:

+0

與得到的服務從測試牀的作品,感謝的方式。然而,當我嘗試異步解決方案時,Karma test runner會打印出一個錯誤:「不能在異步區域測試中使用setInterval」 –

+1

是的,無論是明確使用setInterval還是類似Observable.delay的東西都在使用它。它不能在'async'中使用。不過,你也許可以用'fakeAsync'來使用它。請參閱「另請參閱」中的鏈接。它顯示瞭如何使用'fakeAsync' –