() Öncesinde mocha'daki zaman uyumsuz işlev her zaman it () belirtilmeden önce biter mi?


89

before()Veritabanını temizlemek için bir geri arama işlevim var . before()Başlamadan önce her şeyin bitmesi garantili it()mi?

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(){
});

1
Bu çalışmalı. Sadece yöneticinizden bir söz verdiğinizden emin olmanız gerekir before. Örnbefore(function () { return db.collection...}
broofa

Yanıtlar:


127

Yeni mocha sürümleri için:

Artık mocha'ya bir söz verebilirsiniz ve mocha devam etmeden önce tamamlanmasını bekleyecektir. Örneğin, aşağıdaki test geçecektir:

let a = 0;
before(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      a = 1;
      resolve();
    }, 200);
  });
});
it('a should be set to 1', () => {
  assert(a === 1);
});

Belgeleri burada bulabilirsiniz

Daha eski mocha sürümleri için:

Eşzamansız isteğinizin her şey olmadan önce tamamlanmasını istiyorsanız done, önceki isteğinizdeki parametreyi kullanmanız ve geri aramada çağırmanız gerekir.

Mocha done, sonraki blokları işlemeye başlamak için çağrılana kadar bekleyecektir .

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() {});

Bir veritabanındaki istekler, basit kod yürütmeye kıyasla oldukça uzun olabileceğinden, birim testi için veritabanını saplamamak yürütmeyi büyük ölçüde yavaşlatabileceğinden dikkatli olmalısınız.

Daha fazla bilgi için Mocha belgelerine bakın .


Eşzamansız işlem çok uzun sürerse, pek yardımcı olmayan bir hata mesajı alacağınızı unutmayın: stackoverflow.com/a/48087201/1827734
BrDaHa

Mocha artık kancalarda verilen sözleri destekliyor - mochajs.org/#working-with-promises . Kullanmaya gerek yok done. Sadece bir söz ver.
broofa

Ayrıca edebilirsiniz: before(function () { return db.collection('user').remove({}); })beri remove()getiri bir söz, gerek bir onu sarmak içinnew Promise()
Brent Greeff

7

Umarım db.collection () bir söz vermelidir. Cevabınız evet ise, daha önce de asenkron anahtar kelimeyi kullanabilirsiniz ()

// 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()
});

4
Ne dersin after()? Benim awaitben de diyoruz eserler ince before()(bir DB girişi siler), ama içine aynı şeyi koyarsanız after(), ikinci bir zaman silme şey yapmıyor değil describe()...it()nedeniyle verilere başlar ve başarısız değil kaldırılıyor.
Juha Untinen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.