Saya memiliki fungsi panggilan balik before()
untuk membersihkan database. Apakah semuanya before()
dijamin selesai sebelum it()
dimulai?
before(function(){
db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()?
});
it('test spec', function(done){
// do the test
});
after(function(){
});
javascript
asynchronous
mocha
Nicolas S.Xu
sumber
sumber
before
pawang Anda . Misalnyabefore(function () { return db.collection...}
Jawaban:
Untuk versi baru moka:
Sekarang Anda dapat mengembalikan janji ke moka, dan moka akan menunggunya selesai sebelum melanjutkan. Misalnya, tes berikut akan lulus:
let a = 0; before(() => { return new Promise((resolve) => { setTimeout(() => { a = 1; resolve(); }, 200); }); }); it('a should be set to 1', () => { assert(a === 1); });
Anda dapat menemukan dokumentasinya di sini
Untuk versi mocha yang lebih lama:
Jika Anda ingin permintaan asinkron Anda diselesaikan sebelum hal lainnya terjadi, Anda perlu menggunakan
done
parameter dalam permintaan sebelum Anda, dan memanggilnya di callback.Mocha kemudian akan menunggu hingga
done
dipanggil untuk mulai memproses blok berikut.before(function (done) { db.collection('user').remove({}, function (res) { done(); }); // It is now guaranteed to finish before 'it' starts. }) it('test spec', function (done) { // execute test }); after(function() {});
Anda harus berhati-hati, karena tidak menghentikan database untuk pengujian unit dapat sangat memperlambat eksekusi, karena permintaan dalam database mungkin cukup lama dibandingkan dengan eksekusi kode sederhana.
Untuk informasi lebih lanjut, lihat dokumentasi Mocha .
sumber
done
. Kembalikan saja janji.before(function () { return db.collection('user').remove({}); })
karenaremove()
mengembalikan janji, tidak perlu membungkusnya dengannew Promise()
Mudah-mudahan db.collection () Anda harus mengembalikan janji. Jika ya maka Anda juga dapat menggunakan kata kunci async di before ()
// Note: I am using Mocha 5.2.0. before(async function(){ await db.collection('user').remove({}, function(res){}); // it is now guaranteed to finish before it() });
sumber
after()
? Sayaawait
bekerja dengan baik ketika saya memanggilnyabefore()
(itu menghapus entri DB), tetapi jika saya memasukkan hal yang sama persisafter()
, itu tidak menghapus apa pun pada saat satu detikdescribe()...it()
dimulai dan gagal karena data tidak dihapus.