Функция async в mocha before () всегда завершается до спецификации it ()?

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обработчика. Egbefore(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параметр в своем запросе до и вызвать его в обратном вызове.

Затем Mocha будет ждать вызова, 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 .

Клеман Берту
источник
Обратите внимание, что если асинхронная операция занимает слишком много времени, вы получите сообщение об
ошибке
Mocha теперь поддерживает обещания в хуках - mochajs.org/#working-with-promises . Не нужно использовать done. Просто верните обещание.
broofa
Вы также можете: before(function () { return db.collection('user').remove({}); })поскольку remove()возвращает обещание, нет необходимости заключать его вnew Promise()
Брент Грифф
7

Надеюсь, ваш db.collection () должен вернуть обещание. Если да, то вы также можете использовать ключевое слово async в 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()начинается секунда, и выходит из строя из-за того, что данные не удаляются.
Юха Унтинен