Javascript 如何将自定义消息添加到Jest expect?

Javascript 如何将自定义消息添加到Jest expect?,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,下图为测试用例: it('valid emails checks', () => { ['abc@y.com', 'a@b.nz'/*, ...*/].map(mail => { expect(isValid(mail)).toBe(true); }); }); 我想为每封邮件添加自动生成的邮件,如email'f@f.com'应该是有效的,以便很容易找到失败的测试用例 比如: // .map(email => expect(isValid(email), `E

下图为测试用例:

it('valid emails checks', () => {
  ['abc@y.com', 'a@b.nz'/*, ...*/].map(mail => {
    expect(isValid(mail)).toBe(true);
  });
});
我想为每封邮件添加自动生成的邮件,如
email'f@f.com'应该是有效的
,以便很容易找到失败的测试用例

比如:

// .map(email =>
expect(isValid(email), `Email ${email} should be valid`).toBe(true);
在笑话中有可能吗


在Chai中,可以使用第二个参数,如
expect(value,'custom fail message').to.be…
,而在Jasmine中,它似乎是使用
完成的,因为
子句。但是不能开玩笑地找到解决办法。

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

例如,您可以创建一个
toBeValid(验证器)
matcher:

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
为两种情况(成功和失败)都返回一条消息,因为它允许您使用。测试将失败,并显示相应的消息,具体取决于您是否希望它通过验证

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

我只是自己处理这个问题,我想我可能会做一个公关:但这可以用你喜欢的任何东西。基本上,您可以创建一个自定义方法,允许curried函数将自定义消息作为第三个参数

重要的是要记住expect将设置您的第一个参数(进入
expect(akaThisThing)
的参数)作为自定义函数的第一个参数

从“jest diff”导入差异
期待({
toBeMessage(已收到、预期、消息){
const pass=预期===已接收
const message=pass
?()=>`${this.utils.matcherHint('.not.toBe')}\n\n`+
`预期值不为(使用==):\n`+
`${this.utils.printExpected(预期)}\n`+
`收到:\n`+
`${this.utils.printReceived(received)}`
: () => {
const diffString=diff(预期、接收、{
展开:这个。展开
})
返回`${this.utils.matcherHint('.toBe')}\n\n`+
`预期值为(使用==):\n`+
`${this.utils.printExpected(预期)}\n`+
`收到:\n`+
`${this.utils.printReceived(received)}`+
`${(diffString?`\n\n差异:\n\n${diffString}`:'')}\n`+
`${(msg?`自定义:\n${msg}`:'')}`
}
返回{actual:received,message,pass}
}
})
您可以使用try-catch:

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

您可以尝试此扩展jest的库:

您可以使用:(您可以在测试中定义它)

像这样使用它

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

虽然这不是一个通用的解决方案,但对于希望自定义异常消息来区分循环中的项的常见情况,可以使用Jest

例如,您的示例代码:

it('有效电子邮件检查',()=>{
['abc@y.com', 'a@b.nz'/*,…*/].map(邮件=>{
expect(isValid(mail)).toBe(true);
});
});
反而会变成

test.each(
['abc@y.com', 'a@b.nz'/*, ...*/],
'检查电子邮件%s是否有效',
邮件=>{
expect(isValid(mail)).toBe(true);
}
);

您可以重写
expect
断言以使用
toThrow()
not.toThrow()
。然后对自定义文本抛出错误。
jest
将在输出中包含自定义文本

//返回可能抛出的函数的闭包
功能有效(电子邮件){
return()=>{
//替换为真正的测试!
如果(电子邮件!=='some@example.com') {
抛出新错误(`Email${Email}无效`)
}
}
}
expect(isValid(email)).not.toThrow()

添加自定义错误消息的另一种方法是使用
fail()
方法:

it('valid emails checks', (done) => {
  ['abc@y.com', 'a@b.nz'/*, ...*/].map(mail => {
    if (!isValid(mail)) {
      done.fail(`Email '${mail}' should be valid`)
    } else {
      done()
    }
  })
})

我最后只是用逻辑测试条件,然后用字符串模板使用
fail()

i、 e

进一步说明:

有关更多选项,如下面的
注释
,请参阅

//自定义匹配器-应忽略
期待({
可访问(已接收){
if(pass)返回{pass};
返回{
通过,
消息:()=>
`${this.utils.matcherHint('toBeAccessible','received','{
注释:“对屏幕阅读器可见”,
})}\n
应为:${this.utils.printExpected(true)}
Received:${this.utils.printReceived(false)}`,
};
}

//自定义匹配器-应包括
期待({
可访问(已接收){
if(pass)返回{pass};
返回{
通过,
消息:()=>

`${this.utils.matcherHint('toBeAccessible','received','expected',{//非常感谢,有一个问题-当在某个文件中使用此函数时,该测试文件是本地的,对吗?如果我想在某个全局文件中使用该函数,那么我应该在之前使用
吗?我不完全确定它是否仅用于该文件,但如果它在整个测试运行期间都可用,则可能取决于执行哪个文件当测试并行运行时,这就成了一个问题。但是您可以做的是,将
toBeValid
函数导出到一个帮助文件中,并将其导入并注册到
expect.extend({toBeValid})
无论你在哪里需要它。干得好;我为我的Create React App created App将它添加到setupTests.js中,它解决了我所有的问题……这是一个坏主意,当测试失败时,你无法做出区别,因为返回值为false或
methodThatReturnsBoolean
引发了一个异常。@dave008,是的,这两种情况都会失败est,但错误消息是非常解释性的,取决于出错的原因。@Marc您的代码一定有问题——在示例中,
expect
函数只提供了一个参数/值。这是一种非常简洁的方法,最好尝试捕获解决方案。这似乎与TST不符。这将失败:
expect()
最多接受一个参数。我将此库与typescript一起使用,它可以正常工作flawlessly@Marc确保您已按照
jest expect message
的说明进行了操作。jest需要配置为
     let z = 'TheMassageYouWantWhenErrror';
    expect(first.name).ToBeMatch(second.name,z);
it('valid emails checks', (done) => {
  ['abc@y.com', 'a@b.nz'/*, ...*/].map(mail => {
    if (!isValid(mail)) {
      done.fail(`Email '${mail}' should be valid`)
    } else {
      done()
    }
  })
})
it('key should not be found in object', () => {
    for (const key in object) {
      if (Object.prototype.hasOwnProperty.call(object, key)) {
        const element = object[key];
        if (element["someKeyName"] === false) {
          if (someCheckerSet.includes(key) === false) {
            fail(`${key} was not found in someCheckerSet.`)
          }
        }