Mam funkcję zwrotną, w before()
której służy do czyszczenia bazy danych. Czy wszystko na before()
pewno skończy się przed it()
startem?
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
źródło
źródło
before
opiekuna. Np.before(function () { return db.collection...}
Odpowiedzi:
Nowe wersje mokki:
Możesz teraz zwrócić obietnicę mokce, a mokka będzie czekać na jej zakończenie, zanim przejdziesz dalej. Na przykład następujący test przejdzie:
let a = 0; before(() => { return new Promise((resolve) => { setTimeout(() => { a = 1; resolve(); }, 200); }); }); it('a should be set to 1', () => { assert(a === 1); });
Dokumentację znajdziesz tutaj
Dla starszych wersji mokki:
Jeśli chcesz, aby asynchroniczne żądanie zostało zakończone, zanim wszystko inne się wydarzy, musisz użyć
done
parametru w swoim przed żądaniu i wywołać go w wywołaniu zwrotnym.Mocha będzie wtedy czekać, aż
done
zostanie wezwana do rozpoczęcia przetwarzania kolejnych bloków.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() {});
Należy jednak zachować ostrożność, ponieważ niezastosowanie bazy danych do testów jednostkowych może znacznie spowolnić wykonywanie, ponieważ żądania w bazie danych mogą być dość długie w porównaniu z prostym wykonaniem kodu.
Aby uzyskać więcej informacji, zobacz dokumentację Mocha .
źródło
done
. Po prostu złóż obietnicę.before(function () { return db.collection('user').remove({}); })
ponieważremove()
zwraca obietnicę, nie musisz jej zawijaćnew Promise()
Miejmy nadzieję, że twoja db.collection () powinna zwrócić obietnicę. Jeśli tak, możesz również użyć słowa kluczowego async w 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() });
źródło
after()
? Mojeawait
działa dobrze, kiedybefore()
go wywołuję (usuwa wpis DB), ale jeśli umieszczę dokładnie to samoafter()
, nie usuwa niczego do czasu rozpoczęcia sekundydescribe()...it()
i kończy się niepowodzeniem z powodu braku usunięcia danych.