角茉莉花形式控制单元测试值更改

时间:2019-10-12 15:36:17

标签: angular jasmine karma-jasmine

我想对以下方法进行单元测试:

  this.boxValue = '';

  subscribeToFilterChanges(): void {
    this.filterBox.valueChanges
      .subscribe(
        data => {
          if (data) {
            this.boxValue = data.trim().toLowerCase();
          }
        }
      );
   }

filterBox是一个FormControl:

filterBox = new FormControl('');

HTML是:

    <mat-form-field appearance="standard">
      <input matInput [formControl]="filterBox"
            id="filterBox-input">
    </mat-form-field>

我将单元测试写为:

it('verify filter changes', () => {

    let filterBoxInput = fixture.debugElement.query(By.css('#filterBox-input'));
    filterBoxInput.nativeElement.value = 'dummy';
    filterBoxInput.nativeElement.dispatchEvent(new Event('input'));
    fixture.detectChanges();
    fixture.whenStable().then(() => {
      expect(component.boxValue).toBe('dummy1');
    });
  });

该测试应该会失败,但是即使.toBe()中指定了错误的值,它仍然显示为通过状态

可能是什么问题?

我参考了Angular Testing: FormControl valueChanges Observable,并如上所述在我的代码中使用了它,但这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是,您在操作input时未正确初始化组件。

您必须在创建组件之后立即通过调用fixture.detectChanges();来告诉Angular执行数据分析:

const fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();

此外,如评论中所述,此处不需要whenStable

完成的测试如下:

it('verify filter changes', () => {
  const fixture = TestBed.createComponent(AppComponent);
  fixture.detectChanges();
  const component = fixture.debugElement.componentInstance;
  let filterBoxInput = fixture.debugElement.query(By.css('#filterBox-input'));
  filterBoxInput.nativeElement.value = 'dummy';
  filterBoxInput.nativeElement.dispatchEvent(new Event('input'));
  fixture.detectChanges();
  expect(component.boxValue).toBe('dummy'); // should pass
});

Ng-run Example