J'ai une application Angular 6 et écrit des tests unitaires qui tentent de déterminer si un élément est visible ou non en se basant uniquement sur le résultat booléen d'un *ngIf
directive.
Balisage:
<div class="header" *ngIf="show">
<div>...</div>
</div>
fichier de spécification:
it('should hide contents if show is false', () => {
const button = debugElement.query(By.css('button')).nativeElement;
button.click(); // this will change show to false
fixture.detectChanges();
expect(debugElement.query(By.css('.header')).nativeElement.style.hidden).toBe(true);
});
Je n'arrive pas à obtenir l'attribut hidden
de la div. Est-ce que angular utilise une autre approche pour cacher l'élément au DOM en utilisant le *ngIf
directive? Dois-je obtenir une autre propriété du nativeElement
?
Merci!
Si l'élément est caché, il ne sera pas rendu à l'intérieur du dom.
Tu peux vérifier
expect(fixture.debugElement.query(By.css('.header'))).toBeUndefined();
EDIT : toBeNull()
fonctionne mieux dans le cas ci-dessus
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
Et vous avez également une erreur de syntaxe lors de l'extraction de l'élément button. nativeElement
n'est pas une fonction.
Changez-le de cette façon:
const button = fixture.debugElement.query(By.css('button')).nativeElement;
Lorsque je teste si un composant est affiché ou n'utilise pas ngIf
, j'essaie d'obtenir l'élément (dans ce cas, vous utilisez, c'est-à-dire debugElement.query(By.css('.header')).nativeElement
) et s'il doit être affiché, je m'attends à ce qu'il le soit soyez la vérité, sinon la fausseté.
Quelque chose comme ça:
it('should hide contents if show is false', () => {
// should be rendered initially
expect(debugElement.query(By.css('.header')).nativeElement).toBeTruthy();
//trigger change
const button = debugElement.query(By.css('button')).nativeElement;
button.click(); // this will change show to false
fixture.detectChanges();
// should not be rendered
expect(debugElement.query(By.css('.header')).nativeElement).toBeFalsy();
});
De plus, gardez à l’esprit que vous devez parfois utiliser ComponentFixture#whenStable
pour détecter quand le projecteur est stable comme ceci:
it('should hide contents if show is false', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.whenStable().then(() => {
// same test code here
});
});
Voir ceci test de travail pour un composant qui ressemble à ce scénario .
Voir [référentiel GitHub]
Écrire un cas de test pour *ngIf
condition utilise toBeNull
condition.
Essayez avec le code ci-dessous, cela fonctionne pour moi.
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
Lorsque vous utilisez ngIf, angular supprime complètement le nœud du balisage. Vous devez donc vérifier que cet élément n'existe pas.
ngIf évalue l'expression, puis restitue le modèle then ou else à sa place lorsque expression est respectivement vérité et fausseté.
Pour être plus précis, il n'est tout simplement pas rendu