Как добавить пользовательское сообщение в 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);
}

Ответ 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);