如何使用rejectedWith执行错误消息的完全匹配?

时间:2017-07-21 00:59:58

标签: javascript unit-testing mocha chai chai-as-promised

我最近选择了JS单元测试库Mocha,Chai和Chai-As-Promise。但是,我遇到的情况是,我不确定这是否是默认行为,或者是我错过的。

当我断言从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 chai-as-promised@7.1.1 q@1.5.0

非常感谢。

2 个答案:

答案 0 :(得分:1)

  

这是默认行为吗?

是的,确实如此。 Chai-as-promise正在反映Chai的所作所为。当您使用expect(fn).to.throw("foo")时,Chai正在查找错误消息中的子字符串foo。如果Chai-as-promise的工作方式不同,那将会令人困惑。

  

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

没有选项可供设置。但是,您可以传递正则表达式而不是字符串。如果您使用/^abcde$/进行测试,则错误消息 "abcde"

答案 1 :(得分:0)

要提供使用正则表达式的替代方法,可以执行此操作以强制执行完全匹配:

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,否则它将无法正常运行。