Функциональный JavaScriptUnit-тестыmedium

Проверка expect.toThrow

Пусть нам дана функция drinkFlavor, которая бросает ошибку в случае, когда в нее передается аргумент, равный строке "octopus".

// Спциальный класс ошибки, котоую будет бросать наша функция class DisgustingFlavorError extends Error {} function drinkFlavor(flavor) { if (flavor === 'octopus') { throw new DisgustingFlavorError('yuck, octopus flavor'); } // Дальше делает что-то еще }

С помощью метода toThrow мы можем протестировать, что функция бросает ошибку.

test('throws on octopus', () => { expect(() => { drinkFlavor('octopus'); }).toThrow(); });

Обратите внимание на особенность toThrow. Когда мы используем .toBe, мы передаем в expect результат вызова. Если внутри expect сразу вызвать функцию, которая бросает ошибку, функция test воспримет это как непрошедший тест. Поэтому вызов drinkFlavor мы делаем внутри функции, которую передаем в expect.

Дополнительно мы можем проверить, что ошибка является объектом определенного класса и с каким сообщением она бросается.

Метод toThrow ничего не возвращает в случае успешной проверки (то есть когда тестируемая функция бросает ошибку и — в случае наличия аргумента — ошибка соответствует правилу внутри toThrow).

Метод toThrow бросает произвольную ошибку в случае неудачи (то есть когда тестируемая функция не бросила ошибку).

В качестве аргумента toThrow может принимать:

  • ничего (достаточно проверить, что функция бросает ошибку);
  • регулярное выражение (нужно проверить, что сообщение ошибки подходит под это регулярное выражение);
  • строку (нужно проверить, что сообщение ошибки содержит эту строку);
  • объект ошибки (нужно проверить, что сообщение ошибки совпадает с сообщением переданной ошибки);
  • класс ошибки (нужно проверить, что ошибка является экземпляром этого класса).
test('throws on octopus', () => { // Test that the error message says "yuck" somewhere: these are equivalent expect(() => { drinkFlavor('octopus'); }).toThrow(/yuck/); expect(() => { drinkFlavor('octopus'); }).toThrow('yuck'); // Test the exact error message expect(() => { drinkFlavor('octopus'); }).toThrow(/^yuck, octopus flavor$/); expect(() => { drinkFlavor('octopus'); }).toThrow(new Error('yuck, octopus flavor')); // Test that we get a DisgustingFlavorError expect(() => { drinkFlavor('octopus'); }).toThrow(DisgustingFlavorError); });