【问题标题】:test for error thrown in node.js using mocha chai使用 mocha chai 测试 node.js 中抛出的错误
【发布时间】:2020-06-26 00:39:39
【问题描述】:

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

我真的看不出我所期望的和我得到的有什么不同 - 那么为什么我在这里没有通过测试呢?我希望它是带引号的东西?

谢谢 /基拉

【问题讨论】:

    标签: node.js unit-testing testing mocha.js chai


    【解决方案1】:

    您正在将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")
        })
      })
    })
    

    【讨论】:

    • 非常感谢 - 我猜整个实例就是我所缺少的。我想知道您认为哪种测试更正确?测试错误类型、错误消息或两者。只是为了建立我个人的“良好的测试行为”?
    • 在这种情况下,您可以使用@Sree.Bh 建议的方法检查类型和错误消息。需要注意的一件事是,您在这里期望的错误不是您从自己的代码中抛出的错误。如果例如将来会更改错误消息的措辞(这超出了您的控制范围),您的测试将中断。为了使它更健壮一点,您可以检查 which_min() 函数中的空/缺失参数,然后抛出您自己的错误。在这种情况下,您将控制错误消息并可以在测试中对齐断言
    【解决方案2】:

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

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

    expect(function () { utils.which_min(); })
    .to.throw(TypeError, "Cannot read property 'length' of undefined");
    

    【讨论】:

    • 谢谢 - 这对我有用!我想知道您认为哪种测试更正确?测试错误类型、错误消息或两者。只是为了建立我个人的“良好的测试行为”?
    • 作为单元测试中良好的测试实践,我更愿意同时测试类型和消息。
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2017-10-23
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多