天天看點

Angular單元測試的spyOn使用一例

Spy的核心思路:

避免service方法被實際調用!

Spyon兩個參數:

  • class instance本身
  • 需要被spy的方法名,類型為字元串
    Angular單元測試的spyOn使用一例
    待測試的Component裡有一個Observable數組:
    Angular單元測試的spyOn使用一例
    通過下面的代碼指派:
this.checkoutDeliveryService.getSupportedDeliveryModes();      
Angular單元測試的spyOn使用一例

checkoutDeliveryService的類型:CheckoutDeliveryService

Angular單元測試的spyOn使用一例

在單元測試時,我們需要将CheckoutDeliveryService的實際實作隔離開,通過建立MockCheckoutDeliveryService實作。

首先在單元測試裡建立一個mockcheckoutDeliveryService執行個體:

Angular單元測試的spyOn使用一例

建立一個MockCheckoutDeliveryService類:

class MockCheckoutDeliveryService {
  loadSupportedDeliveryModes = createSpy();
  setDeliveryMode = createSpy();
  getSupportedDeliveryModes(): Observable<DeliveryMode[]> {
    return of();
  }
  getSelectedDeliveryMode(): Observable<DeliveryMode> {
    return of();
  }
  getLoadSupportedDeliveryModeProcess(): Observable<LoaderState<void>> {
    return of();
  }
}      

其方法同真實的CheckoutDeliveryService類方法一緻,差别在于傳回的是空的Observable對象。

在TestBed.configureTestingModule的providers配置裡,使用class MockCheckoutDeliveryService來注入CheckoutDeliveryService:

Angular單元測試的spyOn使用一例

通過TestBed.inject得到mockCheckoutDeliveryService的執行個體:

Angular單元測試的spyOn使用一例

使用spyOn代碼将mockCheckoutDeliveryService類的方法getSupportedDeliveryModes的傳回值設定成of(mockSupportedDeliveryModes):

Angular單元測試的spyOn使用一例

這樣,在單元測試執行時,Component調用checkoutDeliveryService的getSupportedDeliveryModes方法時,會自動傳回我們在spyOn裡指定的值。

繼續閱讀