ChaiJS不处理异常

时间:2014-10-23 17:14:56

标签: javascript node.js mocha chai

这是一个NodeJS模块:

var plural = function(words, num) {
    if (words.length != 3) {
        throw new Error('Wrong words array');
    }
    var lastNum = num % 10;
    var second = (num / 10) % 10;
    if (second == 1)
        return words[2]
    else if (lastNum == 1)
        return words[0];
    else if (lastNum <= 4)
        return words[1];
    else
        return words[2];
};

module.exports = plural;

这是模块测试:

var expect = require('chai').expect;
var plural = require('../plural')

describe('Test with wrong array', function() {

    it('Must throw Error', function() {
        expect(plural(['я','меня'])).to.throw(Error);
    });

});

我想测试异常抛出。但这是mocha的输出:

 Test with wrong array
   1) Must throw Error

 1 failing

 1) Test with wrong array Must throw Error:
    Error: Wrong words array
     at plural (C:\Users\home\Google Drive\Учеба\Спецкурсы\Яндекс.Интерфейсы\TestableCode\testable-code-01\plural.js:3:9)
     at Context.<anonymous> (C:\Users\home\Google Drive\Учеба\Спецкурсы\Яндекс.Интерфейсы\TestableCode\testable-code-01\test\cat.test.js:31:10)
     at callFn (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:250:21)
     at Test.Runnable.run (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:243:7)
     at Runner.runTest (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:373:10)
     at C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:451:12
     at next (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:298:14)
     at C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:308:7
     at next (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:246:23)
     at Object._onImmediate (C:\Users\home\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:275:5)
     at processImmediate [as _immediateCallback] (timers.js:345:15)

因此,我的代码抛出异常,这是正确的行为,并且应该传递测试。但事实并非如此。有什么问题?

3 个答案:

答案 0 :(得分:1)

Chai的to.throw()方法是assertThrows方法的简写,它希望将几个参数传递给它。您可以看到to.throw()here的示例。看起来throws()需要传递你将抛出的Error的构造函数。

如果您有兴趣抛出自定义错误消息,可以在Chai的单独库'assertion-error'here中看到AssertionError的定义。

在您的情况下,您应该能够传递Error.constructorError我想象会达到同样的效果。

expect(plural(['я','меня'])).to.throw(Error);

此外,您必须通过引用传递该函数 - 您将执行该函数,然后才能将其用作预期的参数:

expect(function(){
   plural(['я','меня']);
}).to.throw(Error);

答案 1 :(得分:0)

也许是这句话:

expect(plural(['я','меня'])).to.throw();

应该阅读

expect(plural(['я','меня'])).to.throw(Error);

答案 2 :(得分:0)

如果我只是用

替换你的expect(plural...
expect(plural.bind(undefined, ['я','меня'])).to.throw(Error);

然后它的工作原理。

正如netpoetica所解释的那样,你不能将plural(...)放在expect内,因为在 plural执行之前expect被称为 expect得到的是plural返回值,但由于它会抛出异常,expect无法执行。此外,expect想要的是将调用以检查它是否抛出异常的函数。 netpoetica使用匿名函数来做到这一点。我更喜欢使用bindbind在上面的代码中执行的操作是从plural创建一个新函数,该函数在调用时将this的值设置为undefined,并将第一个参数设置为{{ 1}}。