如何添加自定义消息到Jest期望?

2022-08-30 05:22:11

下图为测试用例:

it('valid emails checks', () => {
  ['abc@y.com', 'a@b.nz'/*, ...*/].map(mail => {
    expect(isValid(mail)).toBe(true);
  });
});

我想为每封电子邮件添加自动生成的消息,以便于找到失败的测试用例。Email 'f@f.com' should be valid

像这样:

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

开玩笑中可能吗?

在Chai中,可以使用第二个参数,例如在Jasmine中,它似乎已经完成了子句。但在开玩笑时找不到解决方案。expect(value, 'custom fail message').to.be....because


答案 1

你试试这个扩展jest的lib: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);
});

答案 2

我认为不可能提供这样的信息。但是你可以定义自己的匹配器

例如,您可以创建一个匹配器: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);

注意:对于这两种情况(成功和失败),都会返回一条消息,因为它允许您使用 .not。测试将失败,并显示相应的消息,具体取决于您是否希望它通过验证。toBeValid

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