Hopp til hovedinnhold
Versjon: Neste

Oppsett og Nedrigging

Unofficial Beta Translation

This page was AI-translated by PageTurner (beta). Not officially endorsed by the project. Found an error? Report issue →

Ofte når du skriver tester trenger du noe opprettingsarbeid som må skje før testene kjører, og noe opprydding som må skje etter at testene er ferdige. Jest tilbyr hjelpefunksjoner for å håndtere dette.

Gjentatt oppsett

Hvis du har arbeid som må gjentas for mange tester, kan du bruke beforeEach og afterEach-kroker.

La oss si at flere tester samhandler med en bydatabase. Du har en metode initializeCityDatabase() som må kalles før hver av disse testene, og en metode clearCityDatabase() som må kalles etter hver test. Dette kan du gjøre slik:

beforeEach(() => {
initializeCityDatabase();
});

afterEach(() => {
clearCityDatabase();
});

test('city database has Vienna', () => {
expect(isCity('Vienna')).toBeTruthy();
});

test('city database has San Juan', () => {
expect(isCity('San Juan')).toBeTruthy();
});

beforeEach og afterEach kan håndtere asynkron kode på samme måter som tester kan håndtere asynkron kode - de kan enten ta en done-parameter eller returnere et løfte. For eksempel, hvis initializeCityDatabase() returnerte et løfte som løste seg når databasen var initialisert, ville vi returnere det løftet:

beforeEach(() => {
return initializeCityDatabase();
});

Engangsoppsett

I noen tilfeller trenger du kun å gjøre oppsett én gang, i starten av en fil. Dette kan være spesielt irriterende når oppsettet er asynkront, så du kan ikke gjøre det inline. Jest tilbyr beforeAll og afterAll-kroker for denne situasjonen.

For eksempel, hvis både initializeCityDatabase() og clearCityDatabase() returnerte løfter, og bydatabasen kunne gjenbrukes mellom tester, kunne vi endre testkoden vår til:

beforeAll(() => {
return initializeCityDatabase();
});

afterAll(() => {
return clearCityDatabase();
});

test('city database has Vienna', () => {
expect(isCity('Vienna')).toBeTruthy();
});

test('city database has San Juan', () => {
expect(isCity('San Juan')).toBeTruthy();
});

Omfang

De øverste before*- og after*-krokene gjelder for alle tester i en fil. Kroker deklarert inni en describe-blokk gjelder kun for testene innenfor den describe-blokken.

La oss si at vi ikke bare hadde en bydatabase, men også en matdatabase. Vi kunne gjøre forskjellig oppsett for forskjellige tester:

// Applies to all tests in this file
beforeEach(() => {
return initializeCityDatabase();
});

test('city database has Vienna', () => {
expect(isCity('Vienna')).toBeTruthy();
});

test('city database has San Juan', () => {
expect(isCity('San Juan')).toBeTruthy();
});

describe('matching cities to foods', () => {
// Applies only to tests in this describe block
beforeEach(() => {
return initializeFoodDatabase();
});

test('Vienna <3 veal', () => {
expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true);
});

test('San Juan <3 plantains', () => {
expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true);
});
});

Merk at den øverste beforeEach utføres før beforeEach inni describe-blokken. Det kan være nyttig for å illustrere kjøringsrekkefølgen til alle kroker.

beforeAll(() => console.log('1 - beforeAll'));
afterAll(() => console.log('1 - afterAll'));
beforeEach(() => console.log('1 - beforeEach'));
afterEach(() => console.log('1 - afterEach'));

test('', () => console.log('1 - test'));

describe('Scoped / Nested block', () => {
beforeAll(() => console.log('2 - beforeAll'));
afterAll(() => console.log('2 - afterAll'));
beforeEach(() => console.log('2 - beforeEach'));
afterEach(() => console.log('2 - afterEach'));

test('', () => console.log('2 - test'));
});

// 1 - beforeAll
// 1 - beforeEach
// 1 - test
// 1 - afterEach
// 2 - beforeAll
// 1 - beforeEach
// 2 - beforeEach
// 2 - test
// 2 - afterEach
// 1 - afterEach
// 2 - afterAll
// 1 - afterAll

Kjøringsrekkefølge

Jest kjører alle describe-behandlere i en testfil før den kjører noen av selve testene. Dette er en grunn til å gjøre oppsett og nedrigging i before*- og after*-behandlere heller enn inne i describe-blokkene. Når describe-blokkene er fullført, kjører Jest som standard alle testene sekvensielt i den rekkefølgen de ble oppdaget i innsamlingsfasen, og venter med å gå videre til hver test er fullført og ryddet opp.

Tenk på følgende illustrerende testfil og utdata:

describe('describe outer', () => {
console.log('describe outer-a');

describe('describe inner 1', () => {
console.log('describe inner 1');

test('test 1', () => console.log('test 1'));
});

console.log('describe outer-b');

test('test 2', () => console.log('test 2'));

describe('describe inner 2', () => {
console.log('describe inner 2');

test('test 3', () => console.log('test 3'));
});

console.log('describe outer-c');
});

// describe outer-a
// describe inner 1
// describe outer-b
// describe inner 2
// describe outer-c
// test 1
// test 2
// test 3

Akkurat som med describe- og test-blokker kaller Jest before*- og after*-krokene i deklarert rekkefølge. Merk at after*-krokene i det omsluttende området kalles først. For eksempel, slik kan du sette opp og rydde opp ressurser som avhenger av hverandre:

beforeEach(() => console.log('connection setup'));
beforeEach(() => console.log('database setup'));

afterEach(() => console.log('database teardown'));
afterEach(() => console.log('connection teardown'));

test('test 1', () => console.log('test 1'));

describe('extra', () => {
beforeEach(() => console.log('extra database setup'));
afterEach(() => console.log('extra database teardown'));

test('test 2', () => console.log('test 2'));
});

// connection setup
// database setup
// test 1
// database teardown
// connection teardown

// connection setup
// database setup
// extra database setup
// test 2
// extra database teardown
// database teardown
// connection teardown
notat

Hvis du bruker jasmine2-testkjøring, merk at den kaller after*-krokene i omvendt deklarert rekkefølge. For å få identisk utdata bør eksemplet over endres slik:

  beforeEach(() => console.log('connection setup'));
+ afterEach(() => console.log('connection teardown'));

beforeEach(() => console.log('database setup'));
+ afterEach(() => console.log('database teardown'));

- afterEach(() => console.log('database teardown'));
- afterEach(() => console.log('connection teardown'));

// ...

Generelle råd

Hvis en test feiler, bør en av de første tingene du sjekker være om testen feiler når den er den eneste testen som kjører. For å kjøre kun én test med Jest, endre midlertidig test-kommandoen til test.only:

test.only('this will be the only test that runs', () => {
expect(true).toBe(false);
});

test('this test will not run', () => {
expect('A').toBe('A');
});

Hvis du har en test som ofte feiler når den kjøres som en del av en større test-suite, men ikke feiler når du kjører den alene, er det sannsynlig at noe fra en annen test forstyrrer denne. Du kan ofte løse dette ved å tømme delt tilstand med beforeEach. Hvis du ikke er sikker på om delt tilstand blir endret, kan du også prøve å bruke en beforeEach som logger data.