2014-01-19 3 views
8

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

Некоторые из моих JavaScript-кода вызывают JavaScript-объекты Error. Эти объекты присваивают значения атрибуту 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; 

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

Спасибо!

+1

Просто хотел выбросить его там: я получал toThrowError - это не сбой функции при использовании пакета npm для жасмина-узла. Оказывается, версия Jasmine используется 1.3 и не поддерживает toThrowError. Используйте toThrow (новая ошибка («ошибка»)). – ltrainpr

ответ

21

Проверка исключения для функции с параметром не поддерживается в жасмине. Но вы можете использовать ниже обходной путь, чтобы преодолеть это ограничение и проверить свои функции.

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 согласовань занимает 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); 
    }); 
}); 
+0

Здравствуйте, спасибо за ваш комментарий. Вы упомянули, что есть помощник с 1 параметром, который принимает тип исключения. Можете ли вы показать пример того, как это работает? Я чувствую, что делаю что-то неправильно, и я не увенчался успехом в этом подходе к работе. – user3192178

+0

У меня есть ответ на ответ с вашим запросом. – user3037143

+0

УБЕДИТЕСЬ, ЧТОБЫ ОБНОВИТЬ. Будет ли это на самом деле работать? Когда я попробовал это, у меня возникла ошибка, которая гласит: «Ошибка: ожидаемое не является ошибкой, строкой или RegExp». Или я делаю что-то не так с моей стороны? Спасибо! – user3192178

Смежные вопросы