Использование toThrowError в Жасмине

Я работаю над приложением, которое активно использует JavaScript. Мне нужно проверить этот код. Для этого я полагаюсь на Жасмин.

некоторые из моего кода JavaScript генерирует объекты ошибок JavaScript. Эти объекты присваивают значения свойству message и name объекта Error. Я назначаю тип исключения свойству name. Например, иногда имя имеет значение "OutOfRangeException", иногда его" ArgumentException " и т. д.

Как использовать функция toThrowError в структуре Jasmine для проверки, имеет ли брошенная ошибка определенное имя? В настоящее время мой 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;

Как я могу написать тест Jasmine, который проверяет ошибку ArgumentException или ошибку ArgumentOutOfRangeException?

спасибо!

2 ответов


проверка исключения для функции с параметром не поддерживается в 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);
    });
});

см. ссылке для различных типов исключений.

Сообщение Об Ошибке

ниже упомянутый фрагмент дает образец для использования пользовательских сообщений об ошибках.

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);
    });
});

Если вы хотите пройти тест, как только ваш метод выдает ошибку. Тогда вы могли бы использовать try-catch блок и когда вы достигнете 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();
        }
    })
})