Функція асинхронізації в мокко перед () завжди закінчується до її () специфікації?


89

У мене є функція зворотного виклику, before()яка призначена для очищення бази даних. Чи все before()гарантовано закінчимо перед it()стартом?

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
Це має спрацювати. Вам просто потрібно переконатися, що ви повернули обіцянку від вашого beforeобробника. Напр.before(function () { return db.collection...}
broofa

Відповіді:


126

Для нових версій мокко:

Тепер ви можете повернути обіцянку в мокку, і мокка буде чекати її завершення, перш ніж продовжувати. Наприклад, пройде наступний тест:

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

Ви можете знайти документацію тут

Для старих версій мокко:

Якщо ви хочете, щоб ваш асинхронний запит був завершений до того, як відбудеться все інше, вам потрібно використати doneпараметр у своєму запиті перед тим, як викликати його у зворотному виклику.

Потім Мокка буде чекати, поки не doneбуде викликано, щоб розпочати обробку наступних блоків.

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

Однак будьте обережні, оскільки не заглушення бази даних для модульного тестування може сильно уповільнити виконання, оскільки запити в базі даних можуть бути досить довгими порівняно з простим виконанням коду.

Для отримання додаткової інформації див. Документацію Mocha .


Зверніть увагу , що якщо асинхронна операція займає надто багато часу, ви отримаєте повідомлення про помилку , що не дуже корисно: stackoverflow.com/a/48087201/1827734
BrDaHa

Mocha тепер підтримує обіцянки в гачках - mochajs.org/#working-with-promises . Не потрібно використовувати done. Просто поверніть обіцянку.
broofa

Ви також можете: before(function () { return db.collection('user').remove({}); })оскільки remove()повертає обіцянку, немає необхідності обертати її вnew Promise()
Брент Гріфф

7

Сподіваємось, ваш db.collection () повинен повернути обіцянку. Якщо так, тоді ви також можете використовувати асинхронне ключове слово в 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()
});

4
Як щодо after()? Моє awaitчудово працює, коли я закликаю його before()(він видаляє запис БД), але якщо я вкладу те саме те саме after(), він не видаляє нічого до моменту початку секунди describe()...it()і не працює через те, що дані не видаляються.
Джуха Унтінен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.