【发布时间】:2019-01-22 19:40:16
【问题描述】:
我有一个 change 函数,我将传递给一个 反应式表单控件 的 change 事件,它评估 dirty 状态并检查控件上是否有任何错误如果是这样,则将布尔标志设置为真/假。然后使用此布尔标志来确定是否显示具有错误消息的<div> 元素。这在浏览器中工作得很好,但是当单元测试运行时,“脏”永远不会被设置为 true。这是我的代码:
HTML
<form [formGroup]="myForm" novalidate>
<input id="age" formControlName="age" (change)="onChange()" />
<div id="ageError" *ngIf="ageIsError()">
<label>Age has errored</label>
</div>
</form>
组件
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.myForm = this.fb.group({
age: [null, [Validators.min(18)]]
});
}
onChange() {
if (this.ageIsError())
// do something
}
ageIsError() {
return this.myForm.controls.age.hasError('min') &&
this.myForm.controls.age.dirty;
}
单元测试
it('should show error message when age is less than 18', fakeAsync(() => {
let age = component.myForm.controls.age;
age.setValue('10', { emitEvent: true });
fixture.detectChanges();
fixture.whenStable().then(() => {
let ageError = debugElement.query(By.css('#ageError')).nativeElement;
expect(component.ageIsError()).toBe(true);
expect(ageError.innerText).toContain('Age has errored');
});
}));
同样,实际实现在浏览器中工作,但单元测试失败。有谁知道在茉莉花中发出事件以将控件设置为脏状态,还是有更好的方法来实现这一点?谢谢!
【问题讨论】:
标签: angular typescript unit-testing jasmine angular-reactive-forms