如何使用拒绝与错误消息完全匹配?



我最近拿起了JS单元测试库Mocha,Chai和Chai-As-Promise。但是,我遇到了一种情况,我不确定这是默认行为还是我错过了。

当我断言从承诺中拒绝的错误消息时,似乎只要预期的错误消息是实际错误消息的子字符串,它就会通过断言。 下面是一个示例:

var chai = require('chai');
var expect = chai.expect;
var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
var q = require('q');
describe('demo test', function(){
// a mock up promise function for demo purpose
function test(input){
var d = q.defer();
setTimeout(function() {
if(input){
d.resolve('12345');
}else{
// throw a new Error after half a sec here
d.reject(new Error('abcde fghij'));
}
}, (500));
return d.promise;
}
// assertion starts here
it('should pass if input is true', ()=>{
return expect(test(true)).to.eventually.equal('12345');
});
it('this passes when matching the first half', ()=>{
return expect(test(false)).to.be.rejectedWith('abcde');
});
it('this also passes when matching the second half', ()=>{
return expect(test(false)).to.be.rejectedWith('fghij');
});
it('this again passes when even only matching the middle', ()=>{
return expect(test(false)).to.be.rejectedWith('de fg');
});
it('this fails when the expected string is not a substring of the actual string', ()=>{
return expect(test(false)).to.be.rejectedWith('abcdefghij');
});
});

这是默认行为吗?如果是,是否有强制与错误消息完全匹配的选项?

mocha@3.4.2 chai@4.0.2 柴如promised@7.1.1 q@1.5.0

非常感谢。

这是默认行为吗?

是的,它是。柴如承诺是柴的所作所为的镜像。当您使用expect(fn).to.throw("foo")时,Chai 正在查找错误消息中foo的子字符串。如果柴如承诺的那样以不同的方式工作,那将是令人困惑的。

如果是,是否有强制与错误消息完全匹配的选项?

没有要设置的选项。但是,您可以传递正则表达式而不是字符串。如果使用/^abcde$/进行测试,则错误消息必须完全"abcde"才能通过。

为了提供使用正则表达式的替代方法,可以这样做来强制执行完全匹配:

it('should fail with an error message "foo".', ()=>{
return expect(fn).to.eventually.be.rejected.and.has.property('messa‌​ge', 'foo');
});

这是检查被拒绝的对象是否具有message">foo"的属性。

请注意:这是为了断言从 Promise 中拒绝/抛出的错误,因此此处需要eventually,否则它将无法正常运行。

相关内容

  • 没有找到相关文章

最新更新