Je suis nouveau dans Angular, j'essaie de construire un champ de texte avec autocomplétion en utilisant Angular 5.
J'ai trouvé cet exemple dans Documents sur les matériaux angulaires :
https://stackblitz.com/angular/kopqvokeddbq?file=app%2Fautocomplete-overview-example.ts
Je me demandais comment écrire un test unitaire pour tester la fonctionnalité d'autocomplétion. Je fixe une valeur à l'élément input et déclenche un événement 'input'. J'ai essayé de sélectionner les éléments mat-option, mais je constate qu'aucun d'entre eux n'a été créé :
Partie pertinente de mon composant html :
<form>
<mat-form-field class="input-with-icon">
<div>
<i ngClass="jf jf-search jf-lg md-primary icon"></i>
<input #nameInput matInput class="input-field-with-icon" placeholder="Type name here"
type="search" [matAutocomplete]="auto" [formControl]="userFormControl" [value]="inputField">
</div>
</mat-form-field>
</form>
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let option of filteredOptions | async" [value]="option.name"
(onSelectionChange)="onNameSelect(option)">
{{ option.name }}
</mat-option>
</mat-autocomplete>
Dossier spécial :
it('should filter users based on input', fakeAsync(() => {
const hostElement = fixture.nativeElement;
sendInput('john').then(() => {
fixture.detectChanges();
expect(fixture.nativeElement.querySelectorAll('mat-option').length).toBe(1);
expect(hostElement.textContent).toContain('John Rambo');
});
}));
function sendInput(text: string) {
let inputElement: HTMLInputElement;
inputElement = fixture.nativeElement.querySelector('input');
inputElement.focus();
inputElement.value = text;
inputElement.dispatchEvent(new Event('input'));
fixture.detectChanges();
return fixture.whenStable();
}
Composant html :
userFormControl: FormControl = new FormControl();
ngOnInit() {
this.filteredOptions = this.userFormControl.valueChanges
.pipe(
startWith(''),
map(val => this.filter(val))
);
}
filter(val: string): User[] {
if (val.length >= 3) {
console.log(' in filter');
return this.users.filter(user =>
user.name.toLowerCase().includes(val.toLowerCase()));
}
}
Avant cela, je me suis rendu compte que pour que l'objet FormControl définisse la valeur, je dois d'abord faire un inputElement.focus(), c'est quelque chose à faire avec l'utilisation de l'entrée mat du matériel angulaire. Y a-t-il quelque chose que je doive faire pour déclencher l'ouverture du volet des options de mat ?
Comment faire pour que ce test fonctionne ?