使用Karma测试Angular服务中的窗口单击和上下文菜单事件

时间:2018-11-24 15:18:27

标签: angular karma-runner addeventlistener

我正在使用我的图书馆Contexr,需要测试窗口的click和contextmenu事件。我想监视我的一项服务,并检查是否使用spyOn调用了某些方法。我尝试了几种方法使用fakeAsync,tick和fixture.detectChanges,但从未调用过我的方法。我知道我的事件已添加,因为正在调用添加事件侦听器的方法。我的initialize方法如下:

public initialize() {
  window.addEventListener('click', (event: MouseEvent) => {
    this.close();
  });
  window.addEventListener('contextmenu', (event: MouseEvent) => {
    this.contexr.addCurrentContext('all', null);
    this.open(event, {
      context: this.contexr.getCurrentContext(),
      top: event.clientY,
      left: event.clientX
    });
  });
}

规格文件如下:

describe('ContextMenuService', () => {
  let contextMenuService: ContextMenuService;
  let fixture: ComponentFixture<ContextDirectiveTestComponent>;
  let element: DebugElement;
  let contexr: ContexrMockService;

  beforeEach(() => {
    contexr = new ContexrMockService();

    TestBed.configureTestingModule({
      declarations: [ ContextDirectiveTestComponent ],
      providers: [
        ContextMenuService,
        { provide: Overlay, useClass: OverlayMock },
        { provide: ContexrService, useValue: contexr }
      ]
    });

    fixture = TestBed.createComponent(ContextDirectiveTestComponent);
    contexr = TestBed.get(ContexrService);
    element = fixture.debugElement.query(By.css('div'));
    contextMenuService = TestBed.get(ContextMenuService);
    contextMenuService.initialize();
  });

  it('should react to window clicks', fakeAsync(() => {
    spyOn(contexr, 'addCurrentContext').and.callThrough();
    element.triggerEventHandler('click', null);
    tick(1000);
    fixture.detectChanges();
    expect(contexr.addCurrentContext).toHaveBeenCalled();
  }));
});

所以,我再次在互联网上问更聪明的人。此测试有什么问题?单击处理程序可以在实际的应用程序中工作,但是我真的想在不考虑发布2.0.0之前使代码覆盖率达到100%。

0 个答案:

没有答案