Saya sedang bekerja dengan beberapa kode di mana saya perlu menguji jenis pengecualian yang dilemparkan oleh fungsi (Apakah itu TypeError, ReferenceError dll.).
Kerangka pengujian saya saat ini adalah AVA dan saya bisa mengujinya sebagai t.throws
metode argumen kedua , seperti di sini:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
Saya mulai menulis ulang tes saya untuk Jest dan tidak dapat menemukan cara untuk melakukannya dengan mudah. Apakah itu mungkin?
sumber
expect('here').not.toBe('here');
hanya untuk bersenang-senang :-)expect('to be').not.toBe('to be')
dalam gaya Shakespeare.Saya menggunakan versi yang sedikit lebih ringkas:
sumber
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 mana2
jumlah pernyataan yang diharapkan . Saya merasa ini lebih akurat menggambarkan maksud tes.Contoh lengkap pengujian jenis dan pesan kesalahan:
Jika
functionUnderTest()
TIDAK melempar kesalahan, pernyataan akan dipukul tetapiexpect.assertions(2)
akan gagal dan tes akan gagal.sumber
expect.hasAssertions()
mungkin alternatif yang lebih baik ketika tes tidak memiliki pernyataan di luarcatch
, karena Anda tidak harus memperbarui nomor jika Anda menambah / menghapus pernyataan.Belum mencobanya sendiri tapi saya akan menyarankan menggunakan pernyataan Jest's toThrow . Jadi saya kira contoh Anda akan terlihat seperti ini:
Sekali lagi, belum mengujinya tetapi saya pikir itu harus berhasil.
sumber
Jest memiliki metode
toThrow(error)
untuk menguji bahwa suatu fungsi melempar ketika dipanggil.Jadi, dalam kasus Anda, Anda harus menyebutnya demikian:
Dok
sumber
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
jika metode yang diejekcreate
tidakasync
.Lelucon modern memungkinkan Anda melakukan lebih banyak pemeriksaan pada nilai yang ditolak. Sebagai contoh:
akan gagal karena kesalahan
sumber
The dokumentasi jelas tentang cara untuk melakukan ini. Katakanlah saya memiliki fungsi yang mengambil dua parameter dan itu akan menimbulkan kesalahan jika salah satunya
null
.Tes Anda
sumber
Jika Anda bekerja dengan
Promise
s:sumber
Saya akhirnya menulis metode kenyamanan untuk perpustakaan alat uji kami
sumber
Lebih jauh ke pos Peter Danis hanya ingin menekankan bagian dari solusinya yang melibatkan "[lewat] fungsi ke harapkan (fungsi). Ke Throw (kosong atau jenis kesalahan)".
Dalam Jest, ketika Anda menguji untuk kasus di mana kesalahan harus dilemparkan, dalam dugaan Anda () pembungkus fungsi dalam pengujian Anda perlu memberikan satu lapisan pembungkus fungsi panah tambahan agar berfungsi. Yaitu
Salah (tetapi pendekatan logis kebanyakan orang):
Baik:
Ini sangat aneh tetapi harus membuat pengujian berjalan dengan sukses.
sumber
mencoba
expect(t).rejects.toThrow()
sumber
try
? tidak ada coba - tapi jawab. Jika ini jawabannya, tolong jelaskan lebih lanjut. apa yang Anda tambahkan ke jawaban yang ada?