【发布时间】:2019-06-04 14:42:20
【问题描述】:
我正在为一个指令(在输入事件上调用)编写单元测试,该指令正在修改 formControl 上的输入值。我在我的规范文件中创建了一个测试组件。我注意到 triggerEventHandler() 和 dispatchEvent() 之间的区别,而 dispatchEvent() 正确触发了事件并触发了指令,但在 triggerEventHandler() 事件未触发的情况下。谁能告诉我,除了在 nativeElement 上调用 dispatchEvent() 之外,它们之间有什么区别。
// directive
export class AlphaNumericCheckDirective {
constructor(private ctrl: NgControl) {
}
@HostListener('input')
onInputChange() {
const pattern = /[^0-9]/g;
const elVal = (this.ctrl.control as AbstractControl).value;
if (pattern.test(elVal)) {
const newVal = elVal.replace(pattern, '');
(this.ctrl.control as AbstractControl).setValue(newVal);
}
}
}
// relevant code of test
it('should allow only numerics', () => {
const fixture = TestBed.createComponent(TestComponent);
const inputEl = fixture.debugElement.query(By.css('input'));
(fixture.componentInstance.testGroup.get('testControl') as
AbstractControl).patchValue('12a');
inputEl.triggerEventHandler('input', null); // not triggering the directive
inputEl.nativeElement.dispatchEvent(new Event('input')); // triggering the directive
});
【问题讨论】:
-
您能否提供一个最小的工作示例作为堆栈闪电战,例如,它更容易理解问题所在并为您提供帮助。我的第一个猜测是,在使用 triggerEventHandler 之后,您应该等待事件通过 fakeAsync 测试设置和 tick() 完成。但是没有看到整个例子,这只是一个初步的猜测。