在单元测试中,当我有一个常规元素时,我可以设置它的值,触发一个change事件并验证表单值匹配如下:
const hostElement = fixture.nativeElement;
const userIdSelect: HTMLInputElement =
hostElement.querySelector('select[formcontrolname="userId"]');
userIdSelect.value = 'myUser';
userIdSelect.dispatchEvent(new Event('change'));
fixture.detectChanges();
expect(component.form.controls.userId.value).toBe('myUser');
我似乎无法使用主要日历控件。
const myDate= new Date(2019,11,31);
const myDateInput: HTMLInputElement = hostElement.querySelector('p-calendar[formcontrolname="myDate"] input');
myDateInput.value = myDate.toLocaleDateString();
myDateInput.dispatchEvent(new Event('input'));
expect(component.form.controls.myDate.value).toBe(myDate.toLocaleDateString());
我有一种感觉这是因为表单绑定到p-calendar元素,而不是它的子输入:
<p-calendar dateFormat="dd/mm/yy" formControlName="myDate"
showIcon="true"
[readonlyInput]="false"></p-calendar>
我已经尝试在输入上调度各种事件(模糊,输入等),但不管我似乎无法获得更新的表单。有任何想法吗?我应该设置p-calendar元素的值而不是它的输入?
在浏览了p-calendar源代码之后,需要做两件事。首先,输入字符串的日期格式必须与日历控件所期望的相匹配,在我的情况下:
myDateInput.value = moment(myDate).format('DD/MM/YYYY');
必须派遣一个keydown事件。
myDateInput.dispatchEvent(new Event('keydown'));