这是一个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)
因此,我的代码抛出异常,这是正确的行为,并且应该传递测试。但事实并非如此。有什么问题?
答案 0 :(得分:1)
Chai的to.throw()方法是assertThrows方法的简写,它希望将几个参数传递给它。您可以看到to.throw()here的示例。看起来throws()需要传递你将抛出的Error的构造函数。
如果您有兴趣抛出自定义错误消息,可以在Chai的单独库'assertion-error'here中看到AssertionError的定义。
在您的情况下,您应该能够传递Error.constructor
或Error
我想象会达到同样的效果。
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使用匿名函数来做到这一点。我更喜欢使用bind
。 bind
在上面的代码中执行的操作是从plural
创建一个新函数,该函数在调用时将this
的值设置为undefined
,并将第一个参数设置为{{ 1}}。