Tengo una prueba de Jest descrita como:
it('Full name must be >= 3 letters', () => { ['', 'a', 'ab', 'a ', 'a ', ' a'].forEach((fullName) => { expect(() => userBuilder.build({ fullName })).toThrowError(); }); }); Cuando falla cualquier iteración, la prueba falla y me dirige a la línea de expect :
user › Full name must be >= 3 letters expect(received).toThrowError() Received function did not throw 15 | ['', 'a', 'ab', 'a ', 'a ', ' a', 'asdf'].forEach((fullName) => { 16 | console.debug('testing', fullName); > 17 | expect(() => userBuilder.build({ fullName })).toThrowError(); | ^ 18 | }); 19 | }); 20 | at src/api/user/user.test.ts:17:53 at Array.forEach (<anonymous>) at Object.<anonymous> (src/api/user/user.test.ts:15:54) lo cual no es muy útil ya que está en un bucle. Necesito saber qué parámetros se pasaron como fullName en la iteración cuando falló la expect .
De esta pregunta SO , sé que puedo usar algo como
test.each([...])('Full name must be >= 3 letters, testing: %s'){...
Pero aquí cada iteración se considera una prueba separada, y tengo cientos de iteraciones de este tipo en decenas de pruebas diferentes (el nombre completo debe tener <= 50 caracteres, el nombre completo debe contener solo alfa y espacios, etc.). Esto infla innecesariamente mi conjunto de pruebas imprimiendo el Full name must be >= 3 letters, testing: texto una y otra vez.
Sé que puedo console.debug('testing', fullName) para cada iteración, pero registra la salida para cada iteración, con algo de detalle agregado alrededor de cada salida, y no se imprime con el mensaje fallido, por lo que con múltiples pruebas , es difícil averiguar qué iteración falló para qué prueba. No sé cómo registrar la salida solo cuando falla una expectativa.
Parece algo tan simple para un corredor de pruebas que estoy seguro de que me debe estar perdiendo algo aquí.
No estoy seguro de si es importante, pero estoy usando ts-jest para mecanografiado.
Use describe para agrupar las reglas de validación, luego use test.each o forEach para hacer la prueba.
describe('Full name must be >= 3 letters', () => { ['', 'a', 'ab', 'a ', 'a ', ' a'].forEach((fullName) => { it(`should throw error when full name is "${fullName}"`, () => { expect(() => userBuilder.build({ fullName })).toThrowError(); }); }); });Entonces, el mensaje de falla se verá así:
Full name must be >= 3 letters ✓ should throw error when full name is "" (9 ms) ✓ should throw error when full name is "a" (1 ms) ✕ should throw error when full name is "ab" (1 ms) ✓ should throw error when full name is "a " (1 ms) ✓ should throw error when full name is "a " ✓ should throw error when full name is " a" ● Full name must be >= 3 letters › should throw error when full name is "ab" expect(received).toThrowError() Received function did not throw 10 | ['', 'a', 'ab', 'a ', 'a ', ' a'].forEach((fullName) => { 11 | it(`should throw error when full name is "${fullName}"`, () => { > 12 | expect(() => userBuilder.build({ fullName })).toThrowError(); | ^ 13 | }); 14 | }); 15 | });