Je lisais la documentation officielle d'Angular2 pour les tests unitaires ( https://angular.io/docs/ts/latest/guide/testing.html ) mais je ne parviens pas à définir la valeur du champ d'entrée d'un composant dans la propriété du composant (lié via ngModel). L'écran fonctionne bien dans le navigateur, mais dans le test unitaire, il semble que je ne puisse pas définir la valeur des champs.
J'utilise le code ci-dessous. "fixture" est correctement initialisé car les autres tests fonctionnent bien. "comp" est une instance de mon composant et le champ de saisie est lié à "user.username" via ngModel.
it('should update model...', async(() => {
let field: HTMLInputElement = fixture.debugElement.query(By.css('#user')).nativeElement;
field.value = 'someValue'
field.dispatchEvent(new Event('input'));
fixture.detectChanges();
expect(field.textContent).toBe('someValue');
expect(comp.user.username).toBe('someValue');
}));
Ma version de Angular2: "@angular/core": "2.0.0"
Les entrées n'ont pas textContent, seulement une valeur. Donc, expect(field.textContent).toBe('someValue');
est inutile. C'est probablement ce qui manque. La deuxième attente devrait passer cependant. Voici un test complet.
@Component({
template: `<input type="text" [(ngModel)]="user.username"/>`
})
class TestComponent {
user = { username: 'peeskillet' };
}
describe('component: TestComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [FormsModule],
declarations: [ TestComponent ]
});
});
it('should be ok', async(() => {
let fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
fixture.whenStable().then(() => {
let input = fixture.debugElement.query(By.css('input'));
let el = input.nativeElement;
expect(el.value).toBe('peeskillet');
el.value = 'someValue';
el.dispatchEvent(new Event('input'));
expect(fixture.componentInstance.user.username).toBe('someValue');
});
}));
});
Il suffit d'ajouter
fixture.detectChanges();
fixture.whenStable().then(() => {
// here your expectation
})
Utilisez votre expect/assert dans la fonction whenStable.then
comme ceci:
component.label = 'blah';
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(component.label).toBe('blah');
}