Dalla mia (anche se limitata) esposizione a Jest, ho scoperto che expect().toThrow()è adatto se si desidera SOLO testare un errore di un tipo specifico:
expect(() => functionUnderTest()).toThrow(TypeError);
O viene generato un errore con un messaggio specifico:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Se provi a fare entrambe le cose, otterrai un falso positivo. Ad esempio, se viene generato il codice RangeError('Something bad happened!'), questo test passerà:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
La risposta di bodolsog che suggerisce l'utilizzo di un tentativo / cattura è vicina, ma invece di aspettarsi che il vero sia falso per garantire che le asserzioni attese nella cattura siano colpite, puoi invece utilizzare expect.assertions(2)all'inizio del test dove si 2trova il numero di asserzioni attese . Sento che questo descrive più accuratamente l'intenzione del test.
Esempio completo di test del tipo AND messaggio di un errore:
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!');
}
});
});
Se functionUnderTest()NON viene generato un errore, le asserzioni verranno colpite ma expect.assertions(2)fallirà e il test fallirà.