Angular 6アプリを使用し、*ngIf
ディレクティブのブール結果のみに基づいて要素が表示されるかどうかを判断しようとするいくつかの単体テストを作成しています。
マークアップ:
<div class="header" *ngIf="show">
<div>...</div>
</div>
スペックファイル:
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);
});
Divからhidden
属性を取得できないようです。 angularは、*ngIf
ディレクティブを使用してDOMから要素を非表示にする別のアプローチを使用しますか? nativeElement
から別のプロパティを取得する必要がありますか?
ありがとう!
要素が非表示の場合、dom内にレンダリングされません。
確認してもいい
_expect(fixture.debugElement.query(By.css('.header'))).toBeUndefined();
_
[〜#〜] edit [〜#〜]:toBeNull()
は上記の場合により良く機能します
_expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
_
また、ボタン要素の取得中に構文エラーが発生します。 nativeElement
は関数ではありません。
このように変更します:
_const button = fixture.debugElement.query(By.css('button')).nativeElement;
_
コンポーネントが表示されているか、ngIf
を使用していないかをテストするとき、要素(この場合はdebugElement.query(By.css('.header')).nativeElement
を使用)を取得しようとします。真実であること、そうでなければ偽りであること。
このようなもの:
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();
});
また、 ComponentFixture#whenStable
フィクスチャが次のように安定したことを検出します。
it('should hide contents if show is false', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.whenStable().then(() => {
// same test code here
});
});
こちらをご覧ください作業テストコンポーネント which このシナリオに似ています 。
[GitHubリポジトリ]を参照してください
*ngIf
条件のテストケースを作成するには、toBeNull
条件を使用します。
以下のコードで試してください、それは私のために機能します。
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
NgIfを使用する場合、angularはノードをマークアップから完全に削除します。この要素が存在しないことを確認する必要があります。
ngIfは式を評価し、式がそれぞれ真実または偽である場合、thenまたはelseテンプレートをその場所にレンダリングします。
より正確には、レンダリングされないだけです