如何对 Angular 中的按钮单击事件进行单元测试?

How to unit test a button click event in Angular?

我正在尝试测试按钮单击事件。官方 Angular 手册说有两种方法可以做到这一点。

1.

it('should raise selected event when clicked (triggerEventHandler)', () => {
  let selectedHero: Hero;
  const heroDe = fixture.debugElement.query(By.css('dashboard-hero'));
  comp.selected.subscribe((hero: Hero) => selectedHero = hero);
  heroDe.triggerEventHandler('click', null);
  expect(selectedHero).toBe(expectedHero);
});
it('should raise selected event when clicked (element.click)', () => {
  let selectedHero: Hero;
  const heroEl: HTMLElement = fixture.nativeElement.querySelector('.hero');
  comp.selected.subscribe((hero: Hero) => selectedHero = hero);
  heroEl.click();
  expect(selectedHero).toBe(expectedHero);
});

第一种方法对我很有效。但是当我尝试第二个选项时,测试 运行 没有错误,但是 Karma 在无限循环中开始了 运行 测试。

这是我对这两种方式的实现。

it('test1', () => {
  fixture.detectChanges();
  let treeNodeElement = fixture.debugElement.query(By.css('#buttonSend'));
  treeNodeElement.triggerEventHandler('click', null);
  expect(component.tabService.tabs.length).toBe(1);
  expect(component.tabService.tabs[0].title).toBe('Test1');
});

it('test2', () => {
  fixture.detectChanges();
  const treeNodeElement: HTMLElement = fixture.nativeElement.querySelector('#buttonSend');
  treeNodeElement.click();
  expect(component.tabService.tabs.length).toBe(1);
  expect(component.tabService.tabs[0].title).toBe('Test1');
});

请问第二个选项哪里出错了?

我的解决方案是在 beforeEach() 中导入 FormsModuleReactiveFormsModule。 问题是单击按钮(这是一个提交按钮)会导致刷新页面的浏览器行为。 即使 FormsModule 和 ReactiveFormsModule 被导入到创建表单的组件中,它们也必须被导入到您所在的 .spec 文件中运行 测试用例

beforeEach(async () => {
 await TestBed.configureTestingModule({
  imports: [
    RouterTestingModule,
    RouterModule.forRoot([]),
    NgbModule,
    FormsModule,  <----
    ReactiveFormsModule,  <----
  ],
  declarations: [  
   ...

两个模块都应该从@angular/forms

导入
import { FormsModule, ReactiveFormsModule } from '@angular/forms';