Búsqueda de sitios web

javascript - ¿Cómo añadir un mensaje personalizado a Jest expect?


Imagen siguiendo el caso de prueba:

it('valid emails checks', () => {
  ['[email ', '[email '/*, ...*/].map(mail => {
    expect(isValid(mail)).toBe(true);
  });
});

Me gustaría agregar un mensaje autogenerado para cada correo electrónico como El correo electrónico '[email ' debería ser válido para que sea fácil encontrar los casos de prueba que fallan.

Algo como:

// .map(email =>
expect(isValid(email), `Email ${email} should be valid`).toBe(true);

¿Es posible en Jest?

En Chai era posible hacerlo con un segundo parámetro como expect(value, 'mensaje de fallo personalizado').to.be... y en Jasmine parece que se hace con la cláusula .because. Pero no puedo encontrar una solución en Jest.

Respuesta #1

Prueba esta librería que extiende jest: https://github.com/mattphillips/jest-expect-message

test('returns 2 when adding 1 and 1', () => {
  expect(1 + 1, 'Woah this should be 2!').toBe(3);
});

Respuesta #2

No creo que sea posible proporcionar un mensaje así. Pero podrías definir tu propio comparador.

Por ejemplo, podrías crear un matcher toBeValid(validator):

expect.extend({
  toBeValid(received, validator) {
    if (validator(received)) {
      return {
        message: () => `Email ${received} should NOT be valid`,
        pass: true
      };
    } else {
      return {
        message: () => `Email ${received} should be valid`,
        pass: false
      };
    }
  }
});

Y luego lo usas así:

expect(mail).toBeValid(isValid);

Nota: toBeValid devuelve un mensaje para ambos casos (éxito y fracaso), porque te permite usar .not. La prueba fallará con el mensaje correspondiente dependiendo de si deseas que pase la validación.

expect(mail).toBeValid(isValid);
// pass === true: Test passes
// pass === false: Failure: Email ... should be valid

expect(mail).not.toBeValid(isValid);
// pass === true: Failure: Email ... should NOT be valid
// pass === false: Test passes

Respuesta #3

Hice esto en un código que estaba escribiendo poniendo mis bloques it dentro de forEach.

Haciendo esto, pude lograr una aproximación muy buena de lo que estás describiendo.

Pros :

  • Excelente informe de errores "nativo"
  • Cuenta la afirmación como su propia prueba
  • No se necesitan complementos.

Así es como se vería tu código con mi método:

// you can't nest "it" blocks within each other,
// so this needs to be inside a describe block. 
describe('valid emails checks', () => {
  ['[email ', '[email '/*, ...*/].forEach(mail => {
    // here is where the magic happens
    it(`accepts ${mail} as a valid email`, () => {
      expect(isValid(mail)).toBe(true);
    })
  });
});

Los errores aparecen así.

¡Fíjate lo bonitos que son estos!

 FAIL  path/to/your.test.js
  ● valid emails checks › accepts [email  as a valid email

    expect(received).toBe(expected)

    Expected: "[email "
    Received: "[email "

      19 |    // here is where the magic happens
      20 |    it(`accepts ${mail} as a valid email`, () => {
    > 21 |      expect(isValid(mail)).toBe(true);
                                       ^
      22 |    })

Respuesta #4

Aunque no es una solución general, para el caso común de querer un mensaje de excepción personalizado para distinguir elementos en un bucle, puedes usar en su lugar test.each de Jest.

Por ejemplo, tu código de ejemplo:

it('valid emails checks', () => {
  ['[email ', '[email '/*, ...*/].map(mail => {
    expect(isValid(mail)).toBe(true);
  });
});

Podría en cambio convertirse

test.each(['[email ', '[email '/*, ...*/])(
    'checks that email %s is valid',
    mail => {
        expect(isValid(mail)).toBe(true);
    }
);

Respuesta #5

Puedes usar try-catch:

try {
    expect(methodThatReturnsBoolean(inputValue)).toBeTruthy();
}
catch (e) {
    throw new Error(`Something went wrong with value ${JSON.stringify(inputValue)}`, e);
}

Artículos relacionados