How do I unit test if an element is visible when the *ngIf directive is used using Jasmine in Angular How do I unit test if an element is visible when the *ngIf directive is used using Jasmine in Angular angular angular

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();