0

オブジェクト。Angular2 +ジャスミンのイベントは、私がテストする必要があり、この単純な方法を持っている

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

テストはOKですが、instanbulは「機能がカバーされていない」と言う:私がテストした場合、このようなものです。だから私は、関数を明示的に呼び出す必要があると思いますか?そのためには、(少なくとも)srcTargetプロパティを含む完全なイベントオブジェクトが必要です。単体テスト内でこのようなイベントを定義するにはどうすればよいですか?

答えて

1

テストでは、擬似イベントで関数を呼び出す必要があります。その後、 component.onLayerContainerClick({ srcElement: { value: 'mock_value' } });

そして多分これhttps://angular.io/guide/testing#triggereventhandlerが、私はイスタンブールのコードを作るこのテスト、作ってみたestusとDrNioに同様

+0

挑戦はtです彼は、引数 'onLayerContainerClick'に渡された引数が' Event'型であると期待しているTypescriptです。 'srcTarget'プロパティでオブジェクトを渡すだけでは、それをカットしません - タイプエラーが発生します。 – pop

+0

OK、各テストの開始時に 'beforeEach'も投稿できますか? btw、component.onLayerContainerClickを試してみると( {srcElement:{value: 'mock_value'}});またはエラーが発生しますか? – DrNio

+1

@pop挑戦ではありません。タイプは、あなたを助けるためのものであり、障害物を作り出すものではありません。 ' arg'や' arg'で必要な引数を渡すことができます。 – estus

0

感謝を助けるかもしれないあなたは

expect(component.closeInfoLayer).toHaveBeenCalled();

期待書きますカバレッジは幸せで、タイプに問題はありません:

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(); 
    }); 
+0

私は 'spyOn(コンポーネント、 'closeInfoLayer');'は必要ないと思います。 'spyOn(myService、 'aMethodThere');' – DrNio

+0

外部サービスの関数呼び出しをチェックしたいときに、これは主に使用されると思います。もう一度テストするには何かが必要です。そのメソッドには変数は設定されておらず、唯一の結果は関数呼び出しです。これは私がテストするものです - 呼び出されます。他には? – pop

+0

あなたが 'spyOn(コンポーネント、 'closeInfoLayer');を削除すると、それはうまくいくはずです。試してみてください。 – DrNio

関連する問題