Introductie
Nu Jest geïnstalleerd is, gaan we een echte test schrijven! We beginnen super simpel en bouwen het langzaam op.
Wat ga je leren?
- De basis structuur van een test
- Een simpele functie testen
- Een React component testen
- Tests draaien en lezen
Anatomie van een Test
Elke Jest test heeft dezelfde basis structuur. Laten we het stap voor stap bekijken:
test('beschrijving van wat je test', () => {
// 1. Arrange - Voorbereiden
// 2. Act - Actie uitvoeren
// 3. Assert - Checken of het klopt
});
De 3 A's: Arrange, Act, Assert
1. Arrange (Voorbereiden)
Zet alles klaar wat je nodig hebt voor de test.
const getal1 = 5;
const getal2 = 3;
2. Act (Actie)
Voer de actie uit die je wilt testen.
const resultaat = optellen(getal1, getal2);
3. Assert (Checken)
Check of het resultaat klopt met wat je verwacht.
expect(resultaat).toBe(8);
Test een Simpele Functie
We beginnen met het testen van een eenvoudige JavaScript functie. Geen React, gewoon pure JavaScript.
Stap 1: Maak een functie
Maak een nieuw bestand: src/utils.js
// Simpele optelfunctie
export function optellen(a, b) {
return a + b;
}
// Functie om te checken of iemand volwassen is
export function isVolwassen(leeftijd) {
return leeftijd >= 18;
}
Stap 2: Schrijf de test
Maak een test bestand: src/utils.test.js
import { optellen, isVolwassen } from './utils';
test('optellen telt twee getallen op', () => {
// Arrange
const getal1 = 5;
const getal2 = 3;
// Act
const resultaat = optellen(getal1, getal2);
// Assert
expect(resultaat).toBe(8);
});
test('isVolwassen geeft true voor 18+', () => {
// Arrange & Act
const resultaat = isVolwassen(20);
// Assert
expect(resultaat).toBe(true);
});
test('isVolwassen geeft false voor onder 18', () => {
const resultaat = isVolwassen(16);
expect(resultaat).toBe(false);
});
Stap 3: Run de test
npm run test
Je zou moeten zien:
PASS src/utils.test.js
✓ optellen telt twee getallen op (3ms)
✓ isVolwassen geeft true voor 18+ (1ms)
✓ isVolwassen geeft false voor onder 18 (1ms)
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Gelukt! Je hebt zojuist 3 tests geschreven en gedraaid. Zo simpel is het!
Test een React Component
Nu gaan we een stapje verder: een React component testen.
Stap 1: Maak een simpel component
Maak een bestand: src/components/Greeting.jsx
function Greeting({ name }) {
return (
<div>
<h1>Hallo, {name}!</h1>
<p>Welkom op onze website</p>
</div>
);
}
export default Greeting;
Stap 2: Schrijf de test
Maak een test: src/components/Greeting.test.jsx
import { render, screen } from '@testing-library/react';
import Greeting from './Greeting';
test('toont de juiste naam', () => {
// Arrange & Act
render(<Greeting name="Jan" />);
// Assert
const heading = screen.getByText('Hallo, Jan!');
expect(heading).toBeInTheDocument();
});
test('toont welkomst tekst', () => {
render(<Greeting name="Piet" />);
const tekst = screen.getByText('Welkom op onze website');
expect(tekst).toBeInTheDocument();
});
Wat gebeurt hier?
render(<Greeting name="Jan" />)- Render het component in een test omgevingscreen.getByText('...')- Zoek een element met bepaalde tekstexpect(...).toBeInTheDocument()- Check of het element bestaat
Stap 3: Run de test
npm run test
Als alles goed gaat, zie je:
PASS src/components/Greeting.test.jsx
✓ toont de juiste naam (45ms)
✓ toont welkomst tekst (12ms)
Test Structuur met describe()
Als je meerdere tests hebt voor hetzelfde component, kun je ze groeperen met describe().
import { render, screen } from '@testing-library/react';
import Greeting from './Greeting';
describe('Greeting component', () => {
test('toont de juiste naam', () => {
render(<Greeting name="Jan" />);
expect(screen.getByText('Hallo, Jan!')).toBeInTheDocument();
});
test('toont welkomst tekst', () => {
render(<Greeting name="Piet" />);
expect(screen.getByText('Welkom op onze website')).toBeInTheDocument();
});
test('werkt met lege naam', () => {
render(<Greeting name="" />);
expect(screen.getByText('Hallo, !')).toBeInTheDocument();
});
});
Waarom describe() gebruiken?
- Groepeer gerelateerde tests
- Betere output in terminal
- Makkelijker te lezen
Output in terminal:
Greeting component
✓ toont de juiste naam
✓ toont welkomst tekst
✓ werkt met lege naam
Tips & Veelgemaakte Fouten
Veelgemaakte Fouten
1. Vergeten om te importeren
// FOUT - geen import
test('...', () => {
render(<Greeting />); // Error!
});
// GOED
import { render, screen } from '@testing-library/react';
import Greeting from './Greeting';
2. Test bestand verkeerde naam
- FOUT:
Greeting-test.jsx - FOUT:
GreetingTest.jsx - GOED:
Greeting.test.jsx - GOED:
Greeting.spec.jsx
3. Vergeten expect()
// FOUT - geen expect, test doet niks
test('optellen werkt', () => {
const resultaat = optellen(2, 3);
// Vergeten te checken!
});
// GOED
test('optellen werkt', () => {
const resultaat = optellen(2, 3);
expect(resultaat).toBe(5); // Check!
});
Goede Test Gewoontes
1. Duidelijke test namen
- SLECHT:
test('test 1') - SLECHT:
test('werkt') - GOED:
test('toont foutmelding bij lege input') - GOED:
test('disabled button als form ongeldig is')
2. Test één ding per test
// SLECHT - test te veel dingen
test('alles werkt', () => {
expect(optellen(1, 2)).toBe(3);
expect(aftrekken(5, 2)).toBe(3);
expect(vermenigvuldigen(2, 3)).toBe(6);
});
// GOED - aparte tests
test('optellen werkt', () => {
expect(optellen(1, 2)).toBe(3);
});
test('aftrekken werkt', () => {
expect(aftrekken(5, 2)).toBe(3);
});
3. Test ook edge cases
// Test normale gevallen
test('optellen met positieve getallen', () => {
expect(optellen(5, 3)).toBe(8);
});
// Test edge cases
test('optellen met 0', () => {
expect(optellen(5, 0)).toBe(5);
});
test('optellen met negatieve getallen', () => {
expect(optellen(-5, 3)).toBe(-2);
});
Handige Shortcuts
Watch mode gebruiken:
npm run test:watch
Dan kun je in de terminal:
- Druk
a- Run alle tests - Druk
f- Run alleen gefaalde tests - Druk
p- Filter op bestandsnaam - Druk
q- Stop watch mode
Wat nu?
Je hebt nu de basis van Jest tests geleerd! Volgende stappen:
- Leer meer matchers - toBe, toEqual, toContain, etc.
- Component testing - Buttons, forms, events