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.
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
Vous pouvez utiliser try-catch:
try {
expect(methodThatReturnsBoolean(inputValue)).toBeTruthy();
}
catch (e) {
throw new Error(`Something went wrong with value ${JSON.stringify(inputValue)}`, e);
}
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);
});
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 :(')
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);