How do I unit test if an element is visible when the *ngIf directive is used using Jasmine in Angular
If the element is hidden, then it wont be rendered inside the dom.
You can check
expect(fixture.debugElement.query(By.css('.header'))).toBeUndefined();
EDIT : toBeNull()
works better in the above case
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
And also you have a syntax error while fetching the button element. nativeElement
is not a function.
Change it this way :
const button = fixture.debugElement.query(By.css('button')).nativeElement;
When testing if a component is being shown or not using ngIf
I try to get the element (in this case you use, i.e., debugElement.query(By.css('.header')).nativeElement
) and if it should be shown I expect it to be truthy, otherwise falsy.
Something like this:
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();
});
Also, bear in mind that sometimes you need to use ComponentFixture#whenStable
to detect when the fixture is stable like this:
it('should hide contents if show is false', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.whenStable().then(() => {
// same test code here
});
});
See this working test for a component which resembles this scenario.
See [GitHub repository]
Writing test case for *ngIf
condition use toBeNull
condition.
Try with below code, it works for me.
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();