在你的例子中
age.setValue(...)
实际上为输入设置了正确的值,但它没有附加
ageError
对于DOM-因为没有真实/模拟事件将控件标记为脏的。这就是为什么这个方法
ageIsError
总是返回
false
在这种情况下。
document.createEvent('Event')
看起来效果不错:
it('should show error message when age is less than 18', async(() => {
const customEvent: Event = document.createEvent('Event');
customEvent.initEvent('input', false, false);
const ageInput = fixture.debugElement.query(By.css('input#age')).nativeElement;
ageInput.value = 10;
ageInput.dispatchEvent(customEvent);
fixture.detectChanges();
fixture.whenStable().then(() => {
let ageError = fixture.debugElement.query(By.css('#ageError')).nativeElement;
expect(component.ageIsError()).toBe(true);
expect(ageError.innerText).toContain('Age has errored');
});
}));
我也找到了解决方案-打电话
age.markAsDirty()
detectChanges
:
it('should show error message when age is less than 18', async(() => {
let age = component.myForm.controls.age;
age.setValue('10'); // { emitEvent: true } is by default
age.markAsDirty(); // add this line
fixture.detectChanges();
fixture.whenStable().then(() => {
let ageError = fixture.debugElement.query(By.css('#ageError')).nativeElement;
expect(component.ageIsError()).toBe(true);
expect(ageError.innerText).toContain('Age has errored');
});
}));
我还创造了一个
stackblitz example
,请也检查一下。希望这些解决方案能对您有所帮助:)