开发者问题收集

测试使用Mocha Chai在Node.js中丢弃的错误

2020-06-25
5857

我是 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

我真的看不出我预期的和实际的有什么区别 - 那么为什么我没有通过这里的测试?我预期它是带引号的东西?

谢谢 /Kira

2个回答

您正在将 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
2020-06-25

同意@krisloekkegaard对 expect(function(){utils.which_min();}).to.throw(new TypeError("Cannot read property 'length' of undefined")) 失败原因的解释:

要检查“错误类型”和“消息”, 使用

expect(function () { utils.which_min(); })
.to.throw(TypeError, "Cannot read property 'length' of undefined");
Sree.Bh
2020-06-25