Jadi, saya menguji komponen yang bergantung pada emitor-acara. Untuk melakukannya saya datang dengan solusi menggunakan Janji dengan Mocha + Chai:
it('should transition with the correct event', (done) => {
const cFSM = new CharacterFSM({}, emitter, transitions);
let timeout = null;
let resolved = false;
new Promise((resolve, reject) => {
emitter.once('action', resolve);
emitter.emit('done', {});
timeout = setTimeout(() => {
if (!resolved) {
reject('Timedout!');
}
clearTimeout(timeout);
}, 100);
}).then((state) => {
resolved = true;
assert(state.action === 'DONE', 'should change state');
done();
}).catch((error) => {
assert.isNotOk(error,'Promise error');
done();
});
});
Pada konsol saya mendapatkan 'UnhandledPromiseRejectionWarning' meskipun fungsi tolak dipanggil karena langsung menampilkan pesan 'AssertionError: Promise error'
(simpul: 25754) UnhandledPromiseRejectionWarning: Penolakan janji yang tidak ditangani (id penolakan: 2): AssertionError: Galat janji: diharapkan {Obyek (pesan, showDiff, ...)} menjadi falsy 1) harus beralih dengan kejadian yang benar
Dan kemudian, setelah 2 detik saya dapatkan
Kesalahan: batas waktu 2000 ms terlampaui. Pastikan panggilan balik yang dilakukan () dipanggil dalam tes ini.
Yang bahkan lebih aneh sejak catchbackback dieksekusi. (Saya pikir karena alasan tertentu kegagalan yang gagal mencegah sisa eksekusi)
Nah, yang lucu, jika saya berkomentar assert.isNotOk(error...)
tes ini berjalan dengan baik tanpa ada peringatan di konsol. Masih 'gagal' dalam arti bahwa itu mengeksekusi tangkapan.
Tapi tetap saja, saya tidak bisa memahami kesalahan ini dengan janji. Bisakah seseorang mencerahkan saya?
Jawaban:
Masalahnya disebabkan oleh ini:
Jika pernyataan gagal, itu akan menimbulkan kesalahan. Kesalahan ini akan menyebabkan
done()
tidak pernah dipanggil, karena kode salah sebelum itu. Itulah yang menyebabkan batas waktu.The "tertangani janji penolakan" juga disebabkan oleh pernyataan gagal, karena jika kesalahan dilemparkan dalam
catch()
handler, dan tidak ada berikutnyacatch()
handler , kesalahan akan mendapatkan ditelan (seperti yang dijelaskan dalam artikel ini ). TheUnhandledPromiseRejectionWarning
peringatan memperingatkan Anda untuk fakta ini.Secara umum, jika Anda ingin menguji kode berbasis janji dalam Mocha, Anda harus mengandalkan fakta bahwa Mocha sendiri sudah dapat menangani janji. Anda seharusnya tidak menggunakan
done()
, tetapi sebaliknya, mengembalikan janji dari ujian Anda. Mocha kemudian akan menangkap kesalahan itu sendiri.Seperti ini:
sumber
catch
pawang mungkin harus diteruskan sebagai argumen keduathen
. Namun, saya tidak sepenuhnya yakin apa maksud OP, jadi saya membiarkannya apa adanya.done.fail('msg')
dalam kasus ini.Saya mendapat kesalahan ini ketika membandel dengan sinon.
Cara mengatasinya adalah dengan menggunakan paket npm sinon seperti yang dijanjikan saat menyelesaikan atau menolak janji dengan bertopik.
Dari pada ...
Gunakan ...
Ada juga metode resolves (perhatikan huruf s pada bagian akhir).
Lihat http://clarkdave.net/2016/09/node-v6-6-and-asynchronously-handled-promise-rejections
sumber
Pustaka pernyataan di Mocha bekerja dengan melemparkan kesalahan jika pernyataan itu tidak benar. Melempar kesalahan menghasilkan janji yang ditolak, bahkan ketika dilempar ke fungsi pelaksana yang disediakan untuk
catch
metode ini.Dalam kode di atas,
error
keberatan dievaluasitrue
sehingga perpustakaan pernyataan melempar kesalahan ... yang tidak pernah tertangkap. Sebagai akibat dari kesalahandone
metode tidak pernah dipanggil.done
Callback Mocha menerima kesalahan ini, jadi Anda bisa dengan mudah mengakhiri semua rantai janji di Mocha.then(done,done)
. Ini memastikan bahwa metode yang dilakukan selalu dipanggil dan kesalahan akan dilaporkan dengan cara yang sama seperti ketika Mocha menangkap kesalahan pernyataan dalam kode sinkron.Saya memberikan kredit untuk artikel ini untuk ide menggunakan. Maka (selesai, dilakukan) ketika menguji janji dalam Mocha.
sumber
Bagi mereka yang mencari kesalahan / peringatan di
UnhandledPromiseRejectionWarning
luar lingkungan pengujian, bisa jadi mungkin karena tidak ada dalam kode yang menangani kesalahan akhirnya dalam sebuah janji:Misalnya, kode ini akan menampilkan peringatan yang dilaporkan dalam pertanyaan ini:
(node:XXXX) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Error reason!
dan menambahkan
.catch()
atau menangani kesalahan harus menyelesaikan peringatan / kesalahanAtau menggunakan parameter kedua dalam
then
fungsisumber
new Promise((resolve, reject) => { return reject('Error reason!'); })
tetapi dalam fungsifunction test() { return new Promise((resolve, reject) => { return reject('Error reason!'); });}
jadi di dalam fungsi kita tidak perlu menggunakan.catch()
tetapi untuk berhasil menangani kesalahan itu cukup untuk digunakan saat memanggil fungsi itutest().catch(e => console.log(e))
atau versi async / menunggutry { await test() } catch (e) { console.log(e) }
Saya menghadapi masalah ini:
Itu kesalahan saya, saya mengganti
res
objekthen(function(res)
, jadi berubahres
hasilnya dan sekarang berfungsi.Salah
Koreksi
Kode layanan:
sumber
Inilah pengalaman saya mengambil dengan E7 async / menunggu :
Jika Anda memiliki panggilan
async helperFunction()
dari pengujian Anda ... (satu alasan dengan ES7async
kata kunci, maksud saya)→ pastikan, Anda menyebutnya demikian
await helperFunction(whateverParams)
(ya, tentu saja, begitu Anda tahu ...)Dan agar itu berfungsi (untuk menghindari 'menunggu adalah kata yang dilindungi undang-undang'), fungsi uji Anda harus memiliki penanda async luar:
sumber
await helperFunction(...)
. Suatuasync
fungsi mengembalikan janji. Anda bisa menangani janji yang dikembalikan seperti yang Anda lakukan pada fungsi yang tidak ditandaiasync
yang terjadi untuk mengembalikan janji. Intinya adalah untuk menangani janji, titik. Apakah fungsinyaasync
atau tidak tidak masalah.await
hanyalah satu di antara banyak cara untuk menangani janji.UnhandledPromiseRejectionWarning
untukku ... jadi jawaban ini.Saya memiliki pengalaman serupa dengan Chai-Webdriver for Selenium. Saya menambahkan
await
pernyataan dan memperbaiki masalah:Contoh menggunakan Cucumberjs:
sumber
Saya memecahkan masalah ini setelah menghapus instalan webpack (bereaksi masalah js).
sumber