2017-07-27 99 views
3

图片下面的测试案例:如何将自定义消息添加到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); 

是否有可能在玩笑

在柴是可以做的第二个参数,如expect(value, 'custom fail message').to.be...和茉莉花似乎是用.because条款完成。但在Jest中找不到解决方案。

回答

0

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

例如,你可以创建一个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 
+0

这是伟大的感谢,还有一个问题 - 当在某个文件中使用这个文件时,它对于该测试文件是本地的吗? 如果我想在某些全局中使用'beforeAll',那么我应该使用'beforeAll'? – Jurosh

+0

我不完全确定它是否仅适用于该文件,但如果它在整个测试中都可用运行,它可能取决于哪个文件首先执行,并且测试并行运行时,这成为一个问题。但是你可以做的是将'toBeValid'函数导出到一个帮助文件中,然后导入并将其注册到'expect.extend({toBeValid})'无论你需要它在哪里。 –

0

就不得不面对这个自己,我想我会成为一个PR它可能:但是这可能是与你喜欢的任何工作。基本上,您可以创建一个自定义方法,允许curried函数将自定义消息作为第三个参数。

重要的是要记住,预计将设置你的第一个参数(即进入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 } 
 
    } 
 
})

相关问题