Karma 测试在 Edge 中随机重启和 "double" iframe

Karma tests randomly restart and "double" iframe in Edge

我的 Angular 7 应用程序有一套 Karma/Jasmine 测试。我所有的测试都在 Chrome 和 Firefox 中通过,但是当我在 Edge 中 运行 它们时,它会 运行 一点点,然后有时它会随机重新加载页面并重新开始,有时它会再次将业力加载到 iframe 中,因此 "doubling" 它。

这是它的样子

但是,当我单击 "Debug" 按钮时,它会打开一个新选项卡,所有测试 运行 都很好,没有失败。

这是我的控制台输出的样子。您可以看到它 运行 进行了一些测试,然后重新启动它们


这是怎么回事?

为什么在没有测试失败的情况下它在 Edge 中会这样?

我弄明白哪里出了问题,原来是导航问题。

我在模板中有一个带有 href="#" 的组件,如下所示:<a href="#" (click)="doSomething($event)"> 然后处理如下:

doSomething($event: Event): void {
  $event.preventDefault();
  someService.whatever();
}

在我的测试中我遇到了这样的事情

it('should call the doSomething() method when a link is clicked', () => {
    spyOn(component, 'doSomething');

    const link: HTMLAnchorElement = debugEl.query(By.css('a')).nativeElement;
    link.click();
    fixture.detectChanges();

    expect(component.doSomething).toHaveBeenCalled();
});

但这导致 Edge(由于某种原因而不是其他浏览器)尝试导航到导致测试重新加载的 #。解决方案是只添加 .and.callThrough() 以便组件可以 运行 $event.preventDefault() 以防止在测试中导航。

所以,上面的测试现在看起来像这样

it('should call the doSomething() method when a link is clicked', () => {
    spyOn(component, 'doSomething').and.callThrough(); //call through to run preventDefault() on the click event

    const link: HTMLAnchorElement = debugEl.query(By.css('a')).nativeElement;
    link.click();
    fixture.detectChanges();

    expect(component.doSomething).toHaveBeenCalled();
});