【问题标题】:Using toThrowError in Jasmine在 Jasmine 中使用 toThrowError
【发布时间】:2014-01-19 19:43:01
【问题描述】:

我正在开发一个大量使用 JavaScript 的应用程序。我需要对这段代码进行单元测试。为了做到这一点,我依靠 Jasmine。

我的一些 JavaScript 代码会抛出 JavaScript Error 对象。这些对象将值分配给 Error 对象的 message 和 name 属性。我为 name 属性分配了一种异常类型。例如,有时名称设置为OutOfRangeException,有时设置为ArgumentException,等等。

如何使用 Jasmine 框架中的toThrowError 函数来测试抛出的错误是否具有特定名称?目前,我的 JavaScript 如下所示:

function getRandomNumber(max) {
  if ((!isNaN(parseFloat(max)) && isFinite(max)) === false) {
    var error = new Error('You must provide a number');
    error.name = 'ArgumentException';
    throw error;
  }

  if ((max === null) || (max < 1) || (max > 100)) {
    var error = new Error('The maximum value must be greater than 0 and less than 100.');
    error.name = 'ArgumentOutOfRangeException';
    throw error;
  }

  return Math.floor(Math.random() * max) + 1;
}

function ArgumentException(message) {
  this.name = 'ArgumentException';
  this.message = message || '';
}
ArgumentException.prototype = new Error();
ArgumentException.prototype.constructor = ArgumentException;

如何编写一个检查 ArgumentException 错误或 ArgumentOutOfRangeException 错误的 Jasmine 测试?

谢谢!

【问题讨论】:

  • 只是想把这个扔出去:我在使用 jasmine-node npm 包时遇到 toThrowError is not a function failure。原来使用的 Jasmine 版本是 1.3,不支持 toThrowError。使用 toThrow(new Error('the error')) 代替。

标签: unit-testing jasmine


【解决方案1】:

jasmine 不支持检查带参数的函数的异常。但是您可以使用以下解决方法来克服此限制并测试您的功能。

describe('toThrowError test case', function() {

    it('test getRandomNumber function for undefined', function() {
        expect(function() {
            getRandomNumber(undefined);
        }).toThrowError("You must provide a number");
    });

    it('test getRandomNumber function for 0', function() {
        expect(function() {
            getRandomNumber(0);
        }).toThrowError("The maximum value must be greater than 0 and less than 100.");
    });

});

toThrowError matcher 接受 1 或 2 个参数

  • 1 参数 - 异常消息或异常类型
  • 2 参数 - 异常类型和异常消息

基于异常类型检查的示例:

function getRandomNumber(max) {
    throw new SyntaxError();
}

describe('toThrowError test case', function() {
    it('test getRandomNumber function for undefined', function() {
        expect(function() {
            getRandomNumber(undefined);
        }).toThrowError(SyntaxError);
    });
});

请参阅link 了解不同类型的异常。

自定义错误消息

下面提到的 sn-p 给出了使用自定义错误消息的示例。

function getRandomNumber(max) {
    throw new ArgumentException();
}

function ArgumentException(message) {
  this.name = 'ArgumentException';
  this.message = message || '';
}

ArgumentException.prototype = new Error();
ArgumentException.prototype.constructor = ArgumentException;

describe('toThrowError test case', function() {
    it('test getRandomNumber function for undefined', function() {
        expect(function() {
            getRandomNumber(undefined);
        }).toThrowError(ArgumentException);
    });
});

【讨论】:

  • 您好,感谢您的评论。您提到有一个带有 1 个参数的匹配器,它采用异常类型。你能举一个例子来说明它是如何工作的吗?我觉得我做错了什么,我没有成功地让这种方法发挥作用。
  • 感谢您的更新。这真的会奏效吗?当我尝试它时,我收到一条错误消息:“错误:预期不是错误、字符串或正则表达式。”。还是我做错了什么?谢谢!
  • 我已经尝试了 jasmine2.0 的代码,然后只更新了答案。你使用的是和原来一样的代码吗?
  • 我使用的是相同的代码。我在 Chrome 中使用了代码。是这个问题吗?
  • 我也在用 chrome。你能在chrome中调试它吗,让我解释一下流程。 (1) 在 jasmine.js 中的 extractExpectedParams() 函数处添加断点 (2) 内部会调用 checkForAnErrorType() 函数 (2) 该函数检查传递的对象是否为 Error 对象类型,如果是这种情况,它应该return true ---在您的情况下,未设置 errorType 变量,这就是它抛出上述错误的原因。您能否检查相同的流程并告诉我跟踪是什么?
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 2012-10-03
  • 2021-03-12
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
相关资源
最近更新 更多