使用 mocha chai 测试 node.js 中抛出的错误
test for error thrown in node.js using mocha chai
我是 node.js 的新手,我在为预计会抛出错误的函数设置简单的单元测试时遇到问题。我的功能很简单:
const which_min = function(array) {
var lowest = 0;
for (var i = 1; i < array.length; i++) {
if (array[i] < array[lowest]) lowest = i;
}
return lowest;
}
我想测试我的函数在没有参数传递给它时是否抛出错误。在我的测试文件夹中我有一个测试文件
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(new TypeError("Cannot read property 'length' of undefined"))
})
})
})
但是我发现了一个非常奇怪的错误:
AssertionError: expected [Function] to throw 'TypeError: Cannot read property \'length\' of undefined' but 'TypeError: Cannot read property \'length\' of undefined' was thrown
+ expected - actual
我真的看不出我所期望的和我得到的有什么不同 - 那么为什么我没有通过这里的测试呢?我希望它是带引号的东西?
谢谢
/基拉
您正在将 TypeError
的新实例传递给 expect()
函数,这意味着它会期望您的 which_min()
函数抛出确切的错误实例(但它不会这样做,它将抛出具有相同错误消息的相同错误类型的另一个实例。
尝试只传递错误字符串,因此:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw("Cannot read property 'length' of undefined")
})
})
})
在这种情况下,Chai 会期望抛出具有相同错误消息的任何错误类型。
您也可以选择断言错误是 TypeError
,如下所示:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(TypeError)
})
})
})
但是您并没有断言错误消息正是您所期望的。
有关详细信息,请参阅此处的官方 Chai 文档:
https://www.chaijs.com/api/bdd/#method_throw
编辑:
如@Sree.Bh 所述,您还可以将预期的错误类型和预期的错误消息传递给 throw()
断言,如下所示:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(TypeError, "Cannot read property 'length' of undefined")
})
})
})
同意@krisloekkegaard 解释 expect(function(){utils.which_min();}).to.throw(new TypeError("Cannot read property 'length' of undefined"))
失败的原因:
检查 'error type' 和 'message', use:
expect(function () { utils.which_min(); })
.to.throw(TypeError, "Cannot read property 'length' of undefined");
我是 node.js 的新手,我在为预计会抛出错误的函数设置简单的单元测试时遇到问题。我的功能很简单:
const which_min = function(array) {
var lowest = 0;
for (var i = 1; i < array.length; i++) {
if (array[i] < array[lowest]) lowest = i;
}
return lowest;
}
我想测试我的函数在没有参数传递给它时是否抛出错误。在我的测试文件夹中我有一个测试文件
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(new TypeError("Cannot read property 'length' of undefined"))
})
})
})
但是我发现了一个非常奇怪的错误:
AssertionError: expected [Function] to throw 'TypeError: Cannot read property \'length\' of undefined' but 'TypeError: Cannot read property \'length\' of undefined' was thrown
+ expected - actual
我真的看不出我所期望的和我得到的有什么不同 - 那么为什么我没有通过这里的测试呢?我希望它是带引号的东西?
谢谢 /基拉
您正在将 TypeError
的新实例传递给 expect()
函数,这意味着它会期望您的 which_min()
函数抛出确切的错误实例(但它不会这样做,它将抛出具有相同错误消息的相同错误类型的另一个实例。
尝试只传递错误字符串,因此:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw("Cannot read property 'length' of undefined")
})
})
})
在这种情况下,Chai 会期望抛出具有相同错误消息的任何错误类型。
您也可以选择断言错误是 TypeError
,如下所示:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(TypeError)
})
})
})
但是您并没有断言错误消息正是您所期望的。
有关详细信息,请参阅此处的官方 Chai 文档: https://www.chaijs.com/api/bdd/#method_throw
编辑:
如@Sree.Bh 所述,您还可以将预期的错误类型和预期的错误消息传递给 throw()
断言,如下所示:
var assert = require('chai').assert;
var expect = require('chai').expect;
describe('#which_min()', function() {
context('with incorrect arguments', function() {
it('errorTest', function() {
expect(function(){utils.which_min();}).to.throw(TypeError, "Cannot read property 'length' of undefined")
})
})
})
同意@krisloekkegaard 解释 expect(function(){utils.which_min();}).to.throw(new TypeError("Cannot read property 'length' of undefined"))
失败的原因:
检查 'error type' 和 'message', use:
expect(function () { utils.which_min(); })
.to.throw(TypeError, "Cannot read property 'length' of undefined");