Z mojego (choć ograniczonego) kontaktu z Jest, stwierdziłem, że expect().toThrow()
jest odpowiedni, jeśli chcesz tylko przetestować, że wyrzucany jest błąd określonego typu:
expect(() => functionUnderTest()).toThrow(TypeError);
Lub wyświetlany jest błąd z określoną wiadomością:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Jeśli spróbujesz zrobić jedno i drugie, otrzymasz fałszywie pozytywny wynik. Na przykład, jeśli twój kod wyrzuca RangeError('Something bad happened!')
, ten test przejdzie:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Odpowiedź bodolsoga, która sugeruje użycie try / catch, jest bliska, ale zamiast oczekiwać, że prawda będzie fałszywa, aby zapewnić trafienie oczekiwanych asercji w catch, możesz zamiast tego użyć expect.assertions(2)
na początku testu, gdzie 2
jest liczba oczekiwanych stwierdzeń . Czuję, że to dokładniej oddaje intencję testu.
Pełny przykład testowania rodzaju i komunikatu błędu:
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!');
}
});
});
Jeśli functionUnderTest()
nie nie wygeneruje błąd, twierdzenia będzie trafienie, ale expect.assertions(2)
nie powiedzie się, a test nie powiedzie się.