Dari paparan saya (walaupun terbatas) ke Jest, saya telah menemukan yang expect().toThrow()
cocok jika Anda ingin HANYA menguji kesalahan yang dilemparkan dari jenis tertentu:
expect(() => functionUnderTest()).toThrow(TypeError);
ATAU kesalahan dilemparkan dengan pesan tertentu:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Jika Anda mencoba melakukan keduanya, Anda akan mendapatkan false positive. Misalnya jika kode Anda dilontarkan RangeError('Something bad happened!')
, tes ini akan lulus:
expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Jawaban oleh bodolsog yang menyarankan menggunakan coba / tangkap dekat, tetapi daripada berharap benar menjadi salah untuk memastikan pernyataan harapan dalam tangkapan terkena, Anda dapat menggunakan expect.assertions(2)
pada awal tes Anda di mana 2
jumlah pernyataan yang diharapkan . Saya merasa ini lebih akurat menggambarkan maksud tes.
Contoh lengkap pengujian jenis dan pesan kesalahan:
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!');
}
});
});
Jika functionUnderTest()
TIDAK melempar kesalahan, pernyataan akan dipukul tetapi expect.assertions(2)
akan gagal dan tes akan gagal.