У меня есть компонент, который содержит форму с 3 входными текстами. Два входа — это чистые текстовые поля, а одно — текстовое поле с директивой ngbTypeahead ng-bootstrap. Моя форма построена с использованием FormBuilder (реактивная форма).
this.form = fb.group({
department: [''],
name: ['', Validators.required],
location: ['', Validators.required]
});
Мой шаблон выглядит так:
<input type="text" class="form-control" formControlName="name"/>
...
<input type="text" class="form-control" formControlName="location"/>
...
<input
type="text"
class="form-control"
formControlName="department"
[ngbTypeahead]="autocompleteDepartments"
[resultFormatter]="formatDepartment"
[inputFormatter]="formatDepartment"/>
Компонент содержит функции для ngbTypeahead
autocompleteDepartments(text$: Observable<string>): Observable<Department> {
....
}
formatDepartment(department: Department) {
return department.name;
}
Итак, this.form.department.value — это не строка, а такой объект:
interface Department {
id: number;
name: string;
foo: boolean;
bar: number;
...
}
Все работает нормально.
Теперь я хочу протестировать свой компонент, и для этого мне нужно установить значение для каждого из трех входов. Для двух чистых входов проблем нет:
const nameHtmlEl = <HTMLInputElement>fixture.debugElement.query(By.css('[formControlName="name"]')).nativeElement;
nameHtmlEl.value = "Toto";
nameHtmlEl.dispatchEvent(new Event('input'));
Но для ввода с директивой ngbTypeahead я не знаю, как установить значение (которое должно быть объектом отдела, а не строкой): я пробовал это, но это не работает:
const departmentHtmlEl = /*<HTMLInputElement>*/ fixture.debugElement.query(By.css('[formControlName="department"]')).nativeElement;
departmentHtmlEl.value = <Department>{id: 10, name: "Foo", ...};
departmentHtmlEl.dispatchEvent(new Event('input'));