Karma覆盖率未统计被spy监听的openSidenav函数如何解决?
问题原因
你使用spyOn方法时,默认会直接替换目标函数的原有实现,只会记录函数的调用状态,不会执行原函数内部的代码。你的测试只验证了openSidenav被调用,但函数内this.showSidenav = true的逻辑全程没有执行,因此Karma的覆盖率工具会判定该函数未被覆盖。
解决方法
修改spy的配置,追加.and.callThrough(),让spy在监听调用状态的同时,保留执行原函数的逻辑:
it('should open sidenav when user click in hamburg icon', () => { // 追加and.callThrough()保证原函数执行 const spyOnOpenSidenav = spyOn(component, 'openSidenav').and.callThrough(); const header = fixture.debugElement.query(By.css('#header')); header.triggerEventHandler('openSidenavEmitter', {}); fixture.detectChanges(); expect(spyOnOpenSidenav).toHaveBeenCalled(); // 额外加断言验证逻辑正确性,测试更严谨 expect(component.showSidenav).toBeTrue(); });
修改后重新运行测试,openSidenav内部的代码会正常执行,覆盖率就会被正确统计。
内容的提问来源于stack exchange,提问作者veroneseComS
相关产品推荐
相关产品推荐

