web-dev-qa-db-fra.com

Comment ajouter un message personnalisé à Jest expect?

Image test suivant:

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

Je voudrais ajouter un message généré automatiquement pour chaque e-mail comme Email '[email protected]' should be valid Afin qu'il soit facile de trouver les cas de test défaillants.

Quelque chose comme:

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

Est-ce possible en Jest?

Dans Chai, il était possible de faire avec un deuxième paramètre comme expect(value, 'custom fail message').to.be... et dans Jasmine, cela semble être fait avec la clause .because. Mais ne trouve pas de solution à Jest.

21
Jurosh

Je ne pense pas qu'il soit possible de transmettre un message comme celui-là. Mais vous pouvez définir votre propre matcher .

Par exemple, vous pouvez créer 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
      };
    }
  }
});

Et puis vous l'utilisez comme ceci:

expect(mail).toBeValid(isValid);

Remarque: toBeValid renvoie un message pour les deux cas (succès et échec), car il vous permet d'utiliser .not . Le test échouera avec le message correspondant selon que vous souhaitez qu'il passe la validation.

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
14
Michael Jungo

Vous pouvez utiliser try-catch:

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

Vous essayez celui-ci: 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);
});
5
Alexey Volkov

Je devais juste m'en occuper moi-même, je pense que je vais peut-être en faire un PR: Mais cela pourrait fonctionner avec tout ce que vous voudriez. Fondamentalement, vous créez une méthode personnalisée qui permet à la fonction curry d'avoir un message personnalisé comme troisième paramètre.

Il est important de se rappeler que expect définira votre premier paramètre (celui qui va dans expect(akaThisThing) comme premier paramètre de votre fonction personnalisée.

import diff from 'jest-diff'

expect.extend({
toBeMessage (received, expected, msg) {
  const pass = expected === received
  const message = pass
? () => `${this.utils.matcherHint('.not.toBe')}\n\n` +
        `Expected value to not be (using ===):\n` +
        `  ${this.utils.printExpected(expected)}\n` +
        `Received:\n` +
        `  ${this.utils.printReceived(received)}`
      : () => {
        const diffString = diff(expected, received, {
          expand: this.expand
        })
        return `${this.utils.matcherHint('.toBe')}\n\n` +
        `Expected value to be (using ===):\n` +
        `  ${this.utils.printExpected(expected)}\n` +
        `Received:\n` +
        `  ${this.utils.printReceived(received)}` +
        `${(diffString ? `\n\nDifference:\n\n${diffString}` : '')}\n` +
        `${(msg ? `Custom:\n  ${msg}` : '')}`
      }

    return { actual: received, message, pass }
  }
})
// usage:
expect(myThing).toBeMessage(expectedArray, ' was not actually the expected array :(')
1
Zargold

vous pouvez utiliser ceci: (vous pouvez le définir à l'intérieur du test)

      expect.extend({
ToBeMatch(expect, toBe, Msg) {  //Msg is the message you pass as parameter
    const pass = expect === toBe;
    if(pass){//pass = true its ok
        return {
            pass: pass,
            message: () => 'No ERRORS ',
          };
    }else{//not pass
        return {
            pass: pass,
            message: () => 'Error in Field   '+Msg + '  expect  ' +  '  ('+expect+') ' + 'recived '+'('+toBe+')',
          };
    }
},  });

et l'utiliser comme ça

     let z = 'TheMassageYouWantWhenErrror';
    expect(first.name).ToBeMatch(second.name,z);
0
Daniel Cohen