Skip to content
intermediate Phase 13 · Testing Angular Applications

Testing Components with TestBed

Render a component in isolation and assert its DOM output.

45m
0 problems
Topic Progress 0%

TestBed Setup

TestBed creates a testing module where you can render components in isolation and assert their DOM output.

Basic Component Test

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { UserCardComponent } from './user-card.component';

describe('UserCardComponent', () => {
  let component: UserCardComponent;
  let fixture: ComponentFixture<UserCardComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [UserCardComponent],
    }).compileComponents();

    fixture = TestBed.createComponent(UserCardComponent);
    component = fixture.componentInstance;
    fixture.detectChanges(); // Trigger initial change detection
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('should display user name', () => {
    component.user = { name: 'Alice', email: 'alice@example.com' };
    fixture.detectChanges(); // Re-render after input change

    const element: HTMLElement = fixture.nativeElement;
    expect(element.textContent).toContain('Alice');
  });
});

TestBed Configuration

await TestBed.configureTestingModule({
  imports: [UserCardComponent],        // Standalone components
  // declarations: [UserCardComponent], // NgModule-based components
  providers: [
    { provide: UserService, useValue: mockUserService },
  ],
}).compileComponents();

detectChanges

// Initial render
fixture.detectChanges();

// After changing component state
component.name = 'New Name';
fixture.detectChanges();

// OnPush components may need explicit detection
fixture.detectChanges();

Querying the DOM

fixture.nativeElement provides access to the rendered DOM for assertions.

Querying Elements

it('should display user email', () => {
  component.user = { name: 'Alice', email: 'alice@example.com' };
  fixture.detectChanges();

  const element: HTMLElement = fixture.nativeElement;
  const emailElement = element.querySelector('.email');
  expect(emailElement?.textContent).toContain('alice@example.com');
});

Querying with DebugElement

import { By } from '@angular/platform-browser';

it('should have a submit button', () => {
  const button = fixture.debugElement.query(By.css('button[type="submit"]'));
  expect(button).toBeTruthy();
});

Simulating User Events

it('should call onSelect when button is clicked', () => {
  spyOn(component.selected, 'emit');

  const button = fixture.nativeElement.querySelector('button');
  button.click();
  fixture.detectChanges();

  expect(component.selected.emit).toHaveBeenCalled();
});

Testing with Inputs

it('should display the title input', () => {
  component.title = 'Hello World';
  fixture.detectChanges();

  const element: HTMLElement = fixture.nativeElement;
  expect(element.querySelector('h2')?.textContent).toBe('Hello World');
});

Complete Component Test Example

describe('CounterComponent', () => {
  let fixture: ComponentFixture<CounterComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [CounterComponent],
    }).compileComponents();

    fixture = TestBed.createComponent(CounterComponent);
    fixture.detectChanges();
  });

  it('should start at zero', () => {
    expect(fixture.nativeElement.textContent).toContain('0');
  });

  it('should increment on button click', () => {
    const button = fixture.nativeElement.querySelector('button');
    button.click();
    fixture.detectChanges();

    expect(fixture.nativeElement.textContent).toContain('1');
  });
});

Quiz

1. What does TestBed.createComponent do?

Question 1 options

2. When do you need to call fixture.detectChanges()?

Question 2 options

3. How do you query DOM elements in tests?

Question 3 options

Flashcards

Question

What does TestBed.createComponent do?

Answer

Creates a component instance in a testing module. Returns ComponentFixture.

Question

When to call detectChanges()?

Answer

After changing component state to trigger re-rendering.

Question

How to query DOM in tests?

Answer

fixture.nativeElement.querySelector or fixture.debugElement.query(By.css())

Revision Notes

Key Takeaways

  • 1. TestBed.createComponent creates components in isolation
  • 2. fixture.detectChanges() triggers change detection
  • 3. fixture.nativeElement queries the rendered DOM
  • 4. Simulate events with .click() and detectChanges()

Interview Tips

  • • Explain the TestBed setup process
  • • Be ready to describe DOM querying approaches
  • • Mention OnPush components and detectChanges

Cheat Sheet

Component Testing Cheat Sheet

Setup:

await TestBed.configureTestingModule({
  imports: [MyComponent],
}).compileComponents();

fixture = TestBed.createComponent(MyComponent);
fixture.detectChanges();

Query DOM:

fixture.nativeElement.querySelector('.class')
fixture.debugElement.query(By.css('button'))

Simulate events:

button.click();
fixture.detectChanges();

Continue Learning