首页 > 解决方案 > Jasmine 中带有 target.value 的调度事件

问题描述

如何change Event在 Jasmine 单元测试中分派一个包含target.value?

被测组件有这样一个方法:

@HostListener('change', ['$event'])
onChange(event) {
  const value = event.target.value;
  this.value = value;
}

请参阅TODO我当前的单元测试草案。我需要target.value在调度事件时包含,但Event界面似乎不包含target属性。

scenarios.forEach((scenario) => {
  it(`changing control value should result in correct value ${scenario.condition}`, fakeAsync(() => {
    // arrange
    component.writeValue(scenario.writtenControlValue);

    // act
    fixture.detectChanges();
    fixture.whenStable().then(() => {
      const input = fixture.debugElement.query(By.css('input')).nativeElement;
      input.value = scenario.newControlValue;
      input.dispatchEvent(new Event('change')); // TODO: pass scenario.newControlValue to Event's target.value

      // assert
      expect(component.value).toEqual(scenario.expectedResult);
    });
  }));
});

标签: angularjasmine

解决方案


看看这个链接,也许你可以使用triggerEventHandler

scenarios.forEach((scenario) => {
  it(`changing control value should result in correct value ${scenario.condition}`, fakeAsync(() => {
    // arrange
    component.writeValue(scenario.writtenControlValue);

    // act
    fixture.detectChanges();
    fixture.whenStable().then(() => {
      const input = fixture.debugElement.query(By.css('input'));
      input.nativeElement.value = scenario.newControlValue;
      input.triggerEventHandler('change', { target: input.nativeElement });


      // assert
      expect(component.value).toEqual(scenario.expectedResult);
    });
  }));
});

我也使用此链接作为指南


推荐阅读