Angular 7,Jasmine代码覆盖率不包含函数,而测试返回正值

时间:2018-11-06 16:02:42

标签: angular unit-testing jasmine angular-material angular7

我有一个功能,可以在单击背景幕时关闭sidenav:

execute(f)

在HTML中:

 public closeSidenav() {
    this.sidenav.toggle();
 }

我正在以下测试中测试'backdropClick'事件:

<mat-sidenav-container (backdropClick)="closeSidenav()">

该测试返回正值,但该功能未包含在代码范围内。我尝试添加

it('should listen to a backdrop click and toggle the sidenav menu', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;

    app.ngOnInit();
    fixture.detectChanges();

    spyOn(app, 'closeSidenav');

    const backdrop = fixture.debugElement.query(By.css('div.mat-drawer-backdrop'));
    backdrop.triggerEventHandler('click', null);

    expect(app.closeSidenav).toHaveBeenCalled();
});

没有其他结果。

这是文件中的最后一个函数,因此我没有得到100%的覆盖率。

只想知道我可能会缺少什么。

1 个答案:

答案 0 :(得分:1)

使用triggerEventHandler时,您需要指定事件绑定而不是动作- backdropClick 而不是 click

<mat-sidenav-container (backdropClick)="closeSidenav()">

const container = fixture.debugElement.query(By.css('mat-sidenav-container'));
container.triggerEventHandler('backdropClick', null);

要获得实际的代码覆盖率,请告诉间谍调用真实代码:

spyOn(app, 'closeSidenav').and.callThrough();