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 2
trova 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à.