簡體   English   中英

Angular2 +茉莉花事件對象

[英]Angular2 + Jasmine Event Object

我有這個簡單的方法需要測試:

  public onLayerContainerClick(event: Event): void {
    event.stopPropagation();
    event.preventDefault();
    if (event.srcElement.classList.contains('dpm-info__layerContainer')) {
     this.closeInfoLayer(event);
    }
  }

我的目標實際上是增加該組件的代碼覆蓋率。 如果我測試是這樣的:

  it( 'should close on info container click', () => {
    spyOn( component, 'onLayerContainerClick' );
    const el: DebugElement = fixture.debugElement.query( By.css( '.dpm-info__layerContainer' ) );
    el.triggerEventHandler( 'click', null );
    expect( component.onLayerContainerClick ).toHaveBeenCalled();
  } );

測試還可以,但是instanbul表示“功能未涵蓋”。 所以我想,我需要顯式調用該函數嗎? 為此,我需要具有完整的事件對象,包括(至少)srcTarget屬性。 如何在單元測試中定義此類事件?

您必須在測試中使用模擬事件來調用該函數。 component.onLayerContainerClick({ srcElement: { value: 'mock_value' } });

然后寫下您的期望

expect( component.closeInfoLayer ).toHaveBeenCalled();

也許這個https://angular.io/guide/testing#triggereventhandler可能也有幫助

感謝estus和DrNio,我提出了這個測試,這使伊斯坦布爾的代碼覆蓋率感到滿意並且沒有任何類型問題:

  it( 'should close on info container click', () => {
    spyOn( component, 'closeInfoLayer' );
    const el: HTMLElement = fixture.debugElement.query(By.css('.dpm-info__layerContainer')).nativeElement;
    const mockEvent: Event = <Event><any>{
      srcElement: {
        classList: el.classList
      },
      stopPropagation: <any>( ( e: any ) => { /**/ }),
      preventDefault: <any>( ( e: any ) => { /**/ }),
    };

    component.onLayerContainerClick( mockEvent );
    expect( component.closeInfoLayer ).toHaveBeenCalled();
  } );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM