З мого (хоч і обмеженого) впливу на Jest, я виявив, що expect().toThrow()
це підходить, якщо ви хочете ТІЛЬКИ перевірити помилку конкретного типу:
expect(() => functionUnderTest()).toThrow(TypeError);
АБО помилка передається з певним повідомленням:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Якщо ви спробуєте зробити те й інше, ви отримаєте помилковий позитив. Наприклад, якщо ваш код кидає RangeError('Something bad happened!')
, цей тест пройде:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Відповідь bodolsog, яка передбачає використання спроби / лову, є близькою, але замість того, щоб очікувати, що правда буде хибною, щоб гарантувати, що твердження про очікування в улові потрапили, ви можете замість цього використати expect.assertions(2)
на початку тесту, де 2
кількість очікуваних тверджень . Я вважаю, що це більш точно описує наміри тесту.
Повний приклад тестування типу І повідомлення про помилку:
describe('functionUnderTest', () => {
it('should throw a specific type of error.', () => {
expect.assertions(2);
try {
functionUnderTest();
} catch (error) {
expect(error).toBeInstanceOf(TypeError);
expect(error).toHaveProperty('message', 'Something bad happened!');
}
});
});
Якщо functionUnderTest()
НЕ вводить помилку, твердження будуть вражені, але expect.assertions(2)
тест не вдасться, а тест закінчиться.