在Jasmine中使用toThrowError

时间:2014-01-19 19:43:02

标签: unit-testing jasmine

我正在开发一款大量使用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测试?

谢谢!

2 个答案:

答案 0 :(得分:30)

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了解不同类型的例外情况。

自定义错误消息

下面提到的代码段提供了使用自定义错误消息的示例。

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 :(得分:0)

如果您希望在方法抛出错误时立即通过测试。然后你可以使用catch阻止,当你到达function ErrorFunction(args:any[]) { throw new Error('An error message'); } describe('Testing a function that throws an error',()=>{ it('should throw an Error',()=>{ try { ErrorFunction(args) } catch (e) { expect(true).toBeTruthy(); } }) }) 区块时,你希望你的测试能够通过。

{{1}}