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.`)
}
}