Setup and Teardown
Muitas vezes ao escrever testes você tem algum trabalho de configuração que precisa acontecer antes de executar testes, e você tem algum trabalho de acabamento que precisa acontecer após os testes executarem. Jest fornece funções de auxilio para lidar com isso.
Repetindo a Configuração Para Vários Testes #
Se você tem algum trabalho que você precisa fazer repetidamente por muitos testes, você pode usar beforeEach
e afterEach
.
Por exemplo, digamos que vários testes interagem com um banco de dados de cidades. Você tem um método initializeCityDatabase()
que deve ser chamado antes de cada um destes testes e um método clearCityDatabase()
que deve ser chamado depois de cada um destes testes. Você pode fazer isso com:
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
e afterEach
podem lidar com código assíncrono da mesma forma que testes podem lidar com código assíncrono - podem tanto levar um parâmetro done
ou retornar uma promessa. Por exemplo, se initializeCityDatabase()
tiver retornado uma promessa que resolve quando o banco de dados foi inicializado, gostaríamos de retornar essa promessa:
beforeEach(() => { return initializeCityDatabase(); });
Configuração Única #
Em alguns casos, você só precisa configurar uma vez, no início de um arquivo. Isto pode ser especialmente incômodo quando a instalação é assíncrona, portanto, não pode fazer isso "inline". Jest fornece beforeAll
e afterAll
para lidar com essa situação.
Por exemplo, se ambos initializeCityDatabase
e clearCityDatabase
retornaram promessas, e o banco de dados de cidades poderia ser reutilizado entre os testes, nós podemos alterar nosso código de teste para:
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(); });
Escopo #
Por padrão, os blocos before
e after
se aplicam a todos os testes em um arquivo. Você também pode agrupar testes junto usando um bloco de describe
. Quando eles estão dentro de um bloco de describe
, os blocos before
e after
só se aplicam aos testes dentro desse bloco de describe
.
Por exemplo, digamos que nós não temos apenas um banco de dados de cidades, mas também um banco de dados de alimentos. Nós podemos fazer uma configuração diferente para diferentes testes:
// 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 sausage', () => { expect(isValidCityFoodPair('Vienna', 'Wiener Schnitzel')).toBe(true); }); test('San Juan <3 plantains', () => { expect(isValidCityFoodPair('San Juan', 'Mofongo')).toBe(true); }); });
Conselho geral #
Se um teste está falhando, uma das primeiras coisas a verificar deveria ser se o teste está falhando quando é o único teste que é executado. Em Jest, é simples de executar somente um teste - basta apenas temporariamente alterar esse comando test
para 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'); });
Se você tiver uma teste que muitas vezes falha quando ele é executado como parte de um conjunto maior, mas não falha quando você executá-lo sozinho, é uma boa aposta que algo de um teste diferente está interferindo com ele. Muitas vezes, você pode consertar isso, limpando algum estado compartilhado com beforeEach
. Se você não tem certeza se algum estado compartilhado está sendo modificado, você também pode tentar um beforeEach
que só registra dados.