Jest to framework testowy stworzony przez Facebooka (Meta), który stanowi fundament testowania aplikacji React. Pomyśl o nim jak o głównym silniku rakietowym -- bez niego żaden test nie ruszy z miejsca.
Testy organizujemy w bloki
describe (opisujące grupę testów) i it lub test (pojedyncze testy):1describe('SpaceShip', () => {
2 it('should have full fuel at start', () => {
3 const ship = createSpaceShip();
4 expect(ship.fuel).toBe(100);
5 });
6
7 it('should consume fuel during travel', () => {
8 const ship = createSpaceShip();
9 ship.travel(50);
10 expect(ship.fuel).toBeLessThan(100);
11 });
12
13 test('should not travel without fuel', () => {
14 const ship = createSpaceShip();
15 ship.fuel = 0;
16 expect(() => ship.travel(10)).toThrow('No fuel');
17 });
18});it i test to aliasy -- robią dokładnie to samo. Konwencja mówi: it('should...') lub test('returns...').Matchery to funkcje, które sprawdzają, czy wynik jest taki, jak oczekujemy. Jest oferuje bogaty zestaw:
1// Dokładna równość
2expect(2 + 2).toBe(4);
3
4// Porównanie obiektów (deep equality)
5expect({ name: 'Apollo' }).toEqual({ name: 'Apollo' });
6
7// Negacja
8expect(fuel).not.toBe(0);1expect(null).toBeNull();
2expect(undefined).toBeUndefined();
3expect('Apollo').toBeDefined();
4expect(true).toBeTruthy();
5expect(0).toBeFalsy();1expect(speed).toBeGreaterThan(0);
2expect(fuel).toBeLessThanOrEqual(100);
3expect(0.1 + 0.2).toBeCloseTo(0.3);1expect('Mission Control').toMatch(/mission/i);
2expect('Apollo 13').toContain('Apollo');1expect(['Earth', 'Mars', 'Jupiter']).toContain('Mars');
2expect(crewMembers).toHaveLength(5);
3expect(spaceship).toHaveProperty('engine');
4expect(spaceship).toHaveProperty('crew.captain', 'Nova');1expect(() => launchWithoutFuel()).toThrow();
2expect(() => divideByZero()).toThrow('Division by zero');
3expect(() => invalidInput()).toThrow(ValidationError);Często testy wymagają przygotowania i czyszczenia środowiska:
1describe('MissionControl', () => {
2 let missionControl;
3
4 // Przed KAŻDYM testem
5 beforeEach(() => {
6 missionControl = new MissionControl();
7 missionControl.initialize();
8 });
9
10 // Po KAŻDYM teście
11 afterEach(() => {
12 missionControl.shutdown();
13 });
14
15 // Przed WSZYSTKIMI testami w grupie
16 beforeAll(() => {
17 console.log('Starting mission control tests');
18 });
19
20 // Po WSZYSTKICH testach w grupie
21 afterAll(() => {
22 console.log('All tests completed');
23 });
24
25 it('should have zero active missions at start', () => {
26 expect(missionControl.activeMissions).toBe(0);
27 });
28});Wiele operacji w kosmosie wymaga czasu -- tak samo w kodzie:
1// Zwracanie Promise
2test('fetches crew data', () => {
3 return fetchCrewData().then(data => {
4 expect(data).toHaveLength(5);
5 });
6});
7
8// Async/await (preferowane)
9test('fetches crew data', async () => {
10 const data = await fetchCrewData();
11 expect(data).toHaveLength(5);
12});
13
14// Testowanie odrzuconego Promise
15test('throws on invalid mission', async () => {
16 await expect(fetchMission(-1)).rejects.toThrow('Invalid mission ID');
17});Mock functions pozwalają symulować zachowanie funkcji bez ich prawdziwego wywoływania:
1// Tworzenie mock function
2const mockLaunch = jest.fn();
3
4// Wywołanie
5mockLaunch('Apollo', 'Moon');
6
7// Sprawdzenie
8expect(mockLaunch).toHaveBeenCalled();
9expect(mockLaunch).toHaveBeenCalledTimes(1);
10expect(mockLaunch).toHaveBeenCalledWith('Apollo', 'Moon');
11
12// Mock z wartością zwrotną
13const mockFuel = jest.fn().mockReturnValue(100);
14expect(mockFuel()).toBe(100);
15
16// Mock z implementacją
17const mockCalculateRoute = jest.fn((from, to) => {
18 return { distance: 1000, estimatedTime: '2h' };
19});Jest oferuje kilka przydatnych komend do uruchamiania testow:
1# Uruchom wszystkie testy
2npm test
3
4# Uruchom testy w trybie watch (automatycznie po zmianach)
5npm test -- --watch
6
7# Uruchom testy z konkretnego pliku
8npm test -- SpaceShip.test.js
9
10# Uruchom testy pasujace do wzorca
11npm test -- --testPathPattern="mission"
12
13# Uruchom z raportem pokrycia kodu
14npm test -- --coverageit('should calculate fuel consumption for 100km trip') zamiast it('test fuel')Jest to potezny silnik rakietowy testow -- opanowanie go da Ci pewnosc, że Twoja aplikacja dziala poprawnie w kazdych warunkach kosmicznych!