17.07.2024

Komponententests in Angular: Ein Leitfaden

von Markus Wiktorin

Graphik Komponententests in Angular: Ein Leitfaden
import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
	selector: 'app-counter',
	template: `
	    <div>
		    <p data-testid="counter-value">{{ counter }}</p>
		    <button (click)="increment()" data-testid="increment-btn">+</button>
		    <button (click)="decrement()" data-testid="decrement-btn">-</button>
		    <button (click)="clicked.emit()" data-testid="output-btn">Emit Output</button>
	    </div>
	`,
	standalone: true
})
export class CounterComponent {
	@Input() counter = 0;
	
	@Output() clicked = new EventEmitter<void>();
	
	increment() {
	    this.counter++;
	}
	
	decrement() {
	    this.counter--;
	}
}
let fixture: ComponentFixture<CounterComponent>;
let component: CounterComponent;

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

  fixture = TestBed.createComponent(CounterComponent);
  component = fixture.componentInstance;
});
let fixture: ComponentFixture<CounterComponent>;
let component: CounterComponent;

beforeEach(() => {
  fixture = TestBed.createComponent(CounterComponent);
  component = fixture.componentInstance;
});
component.counter = 5;                        // Variante 1
fixture.componentRef.setInput('counter', 5);  // Variante 2

fixture.detectChanges();
expect(fixture.nativeElement.querySelector('[data-testid="counter-value"]').textContent).toBe('5');
it('should emit output event', () => {
  jest.spyOn(component.clicked, 'emit');
  const button = fixture.nativeElement.querySelector('[data-testid="output-btn"]');
  button.click();
  fixture.detectChanges();
  expect(component.clicked.emit).toHaveBeenCalled();
});
import userEvent from '@testing-library/user-event';

it('should increment the counter', async () => {
  const user = userEvent.setup();
  const button = fixture.nativeElement.querySelector('[data-testid="increment-btn"]');
  await user.click(button);
  fixture.detectChanges();
  expect(fixture.nativeElement.querySelector('[data-testid="counter-value"]').textContent).toBe('1');
});

Beitrag von

Markus Wiktorin
Markus Wiktorin

Markus ist Softwareentwickler und hat in verschiedenen Projekten und Technologien Erfahrungen gesammelt, dabei spielte das Testen immer eine wichtige Rolle. Das gilt besonders für eine große verteilte Angular-Applikation, an der er mitgewirkt hat.

Weitere Blog-Beiträge

Loading...