Как добавить пользовательское сообщение в Jest?
Изображение следующего тестового примера:
it('valid emails checks', () => {
['[email protected]', '[email protected]'/*, ...*/].map(mail => {
expect(isValid(mail)).toBe(true);
});
});
Я хотел бы добавить автоматически сгенерированное сообщение для каждого электронного письма, так как Email '[email protected]' should be valid
чтобы было легко найти неудачные тестовые примеры.
Что-то вроде:
// .map(email =>
expect(isValid(email), 'Email ${email} should be valid').toBe(true);
Возможно ли это в Jest?
В Chai можно было сделать со вторым параметром вроде expect(value, 'custom fail message').to.be...
и в Jasmine кажется, что это сделано с предложением .because
. Но не может найти решение в Jest.
Ответы
Ответ 1
Я не думаю, что возможно предоставить такое сообщение. Но вы можете определить свой собственный сопоставитель.
Например, вы можете создать 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
};
}
}
});
И тогда вы используете это так:
expect(mail).toBeValid(isValid);
Примечание: toBeValid
возвращает сообщение для обоих случаев (успех и неудача), потому что это позволяет вам использовать .not
. Тест завершится неудачно с соответствующим сообщением в зависимости от того, хотите ли вы, чтобы оно прошло проверку.
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
Ответ 2
Вы можете использовать try-catch:
try {
expect(methodThatReturnsBoolean(inputValue)).toBeTruthy();
}
catch (e) {
throw new Error('Something went wrong with value ${JSON.stringify(inputValue)}', e);
}
Ответ 3
Вы попробуете это: 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);
});
Ответ 4
Я просто должен был разобраться с этим сам, думаю, я сделаю пиар на это, возможно: Но это может работать с чем угодно. По сути, вы создаете пользовательский метод, который позволяет функции карри иметь пользовательское сообщение в качестве третьего параметра.
Важно помнить, что в качестве первого параметра вашей пользовательской функции expect(akaThisThing)
параметр (тот, который входит в expect(akaThisThing)
будет установлен.
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 }
}
})
Ответ 5
Вы можете использовать это: (вы можете определить это внутри теста)
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+')',
};
}
}, });
и использовать это так
let z = 'TheMassageYouWantWhenErrror';
expect(first.name).ToBeMatch(second.name,z);