Пусть нам дана функция 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); });