2017-04-05 10 views
0

は今、私は以下のようにこのような状況のためのユニットテストを書いています:角度2でフィルタを使用してサブスクライブ関数の単体テストを書く方法は?

public div: HTMLDivElement; 
public currentEvent: EventType; 

public listenToRender() { 
    this.adsService.render.filter((event: EventType) => { 
      return this.div.id === event.slot.getSlotElementId(); 
     }).subscribe((event: EventType) => { 
      let custom_event = new CustomEvent('render', { 
       detail: event 
      }); 
      this.currentEvent= event; 
     }); 
} 

をユニットテストの間に、私は主題でレンダリングモックが、私はそれを渡すことができますかわかりませんフィルタ

return this.div.id === event.slot.getSlotElementId(); 

サブスクライブ機能に移動します。

class MockAdsService { 
    render = new Subject(); 
} 

class MockEventType { 
    name: 'test_event'; 
    slot: { 
     getSlotElementId = function() {return 'test_id'} 
    }; 
} 

describe('test',() => { 
    let mockAdsService: MockAdsService, 
     mockEventType: MockEventType; 

    beforeEach(() => { 
     mockAdsService = new MockAdsService(); 
     mockEventType = new MockEventType(); 
    }); 

    it('listenToRender fired correctly',() => { 
     mockAdsService.render.next(mockEventType); 
     component.listenToRender(); 
     expect(component.currentEvent).toEqual(mockEventType); 
    }); 
}); 

フィルタを通過させるためにsubject.nextに何かを設定する必要はありますか?

+1

は 'spyOn'の代わりに、' subject'を使用する方がよいかもしれません。 'spyOn(service.render、 'filter')と.returnValue(Observable.of(expected_data))を試してください。 ' – Sasxa

+0

ありがとう、Sasxa。あなたは私の日を救う! 'spyOn(service.render、 'filter')と.returnValue(Observable.of(mockEventType))'とタイプした後、 'listenToRender()'を実行したときに 'mockEventType'を使ってフィルタを作成し、 'subscribe' – donggaolao

+0

@SasxaあなたはなぜspyOnが' filter'に値を渡すことができるのか説明できますか? – donggaolao

答えて

1

非常に簡単です。のイベントが既に発生した後で、コンポーネントを購読しています。寒くても観察するのは遅すぎる。ただ、render.next()component.listenToRender()通話を切り替えて、すべてがうまく動作するはずです:

it('listenToRender fired correctly',() => { 
    component.listenToRender(); 
    mockAdsService.render.next(mockEventType); 
    expect(component.currentEvent).toEqual(mockEventType); 
}); 
関連する問題