У меня есть функция обратного вызова, предназначенная 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(){
});
javascript
asynchronous
mocha
Николя С.Сю
источник
источник
before
обработчика. Egbefore(function () { return db.collection...}
Ответы:
Для новых версий мокко:
Теперь вы можете вернуть обещание в мокко, и мокко дождется его завершения, прежде чем продолжить. Например, пройдет следующий тест:
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 .
источник
done
. Просто верните обещание.before(function () { return db.collection('user').remove({}); })
посколькуremove()
возвращает обещание, нет необходимости заключать его вnew Promise()
Надеюсь, ваш 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() });
источник
after()
? Мойawait
работает нормально, когда я вызываю егоbefore()
(он удаляет запись в БД), но если я помещаю то же самоеafter()
, он ничего не удаляет к тому времени, когдаdescribe()...it()
начинается секунда, и выходит из строя из-за того, что данные не удаляются.