Setup and Teardown
A menudo cuando escribes las pruebas tienes algo de trabajo de preparación que necesita pasar antes de correr las pruebas, y tienes trabajo de finalización que debe pasar luego de correr las pruebas. Jest provee funciones de ayuda para manejar esto.
Repitiendo "preparación" para muchas pruebas #
Si tienes algo de trabajo que necesitas hacer repetidamente para muchas pruebas, puedes usar beforeEach
y afterEach
.
Por ejemplo, digamos que varias pruebas interactúan con la base de datos de ciudades. Tienes un método initializeCityDatabase()
que debe ser llamada antes de cada prueba, y un método clearCityDatabase()
que debe ser llamado luego de cada prueba. Puedes hacer esto con:
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
y afterEach
pueden manejar código asíncrono en el mismo modo que las pruebas manejan código asíncrono - ambos pueden tomar done
como parámetro o devolver una promesa. Por ejemplo, si initializeCityDatabase()
devuelve una promesa que es resuelta cuando la base de datos es inicializada, nos gustaría que devuelva esa promesa:
beforeEach(() => { return initializeCityDatabase(); });
Preparación de una vez #
En algunos casos, solo necesitarás realizar la preparación una sola vez, al principio del archivo. Esto puede ser especialmente molesto cuando la preparación es asíncrona, entonces tú simplemente no puedes hacerlo en seguidilla. Jest proporciona beforeAll
y afterAll
para manejar esta situación.
Por ejemplo, si initializeCityDatabase
y clearCityDatabase
devolvieron promesas, y la base de datos de de ciudades podría ser reutilizado entre pruebas, podríamos cambiar nuestro código de prueba 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(); });
Alcance #
Por defecto, los bloques before
y after
aplicarán a cada prueba en un archivo. También puede agrupar pruebas usando un bloque de describe
. Cuando están dentro de un bloque describe
, los bloques before
y after
sólo se aplican a las pruebas dentro de ese bloque describe
.
Por ejemplo, supongamos que hemos tenido no sólo una base de datos de ciudades, sino también una base de datos de alimentos. Podríamos hacer una configuración diferente para diferentes pruebas:
// 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); }); });
Aviso General #
Si una prueba falla, una de las primeras cosas a revisar debería ser si la prueba falla cuando se corre solo esa prueba. En Jest es simple correr una sola prueba - solo cambia temporalmente ese comando test
a 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'); });
Si tienes una prueba que a menudo falla cuando es una parte de una ejecución de una larga suite, pero no falla cuando la corres sola, es una buena apuesta que algo de otra prueba diferente está interfiriendo con esta. A menudo puedes arreglar esto limpiando algo de estados compartidos con beforeEach
. Si no estas seguro de que algo de estados compartidos está siendo compartido, puedes también probar un beforeEach
que simplemente imprime los datos.