Async Mocha: `done` вызывается, но следующий тест никогда не запускается
У меня нетрадиционная настройка, которую я не могу изменить. Это выглядит примерно так:
- проверить POST на сервер
- POSTs сервера к блокчейну
- обновления блокчейна
- скрипт синхронизации обновляет базу данных
Абсолютно необходимо, чтобы я не запускал следующий тест до тех пор, пока он не завершит весь этот рабочий процесс, который обычно занимает 2-3 секунды. Вот пример теста, написанного для этого потока с supertest и chai:
it('should create a user', done => {
request(server)
.post(`${API}/signup`)
.set('Content-Type', 'application/json')
.send(`{
"email":"${USER_EMAIL}",
"password":"${USER_PASSWORD}"
}`)
.expect(200)
.expect(res => {
expect(res.body.role).to.equal('user');
expect(res.body.id).to.match(ID_PATTERN);
})
.end(_wait(done));
});
Тот _wait
функция является ключевым вопросом здесь. Если я напишу это очень наивно с setTimeout, это будет работать:
const _wait = cb => () => setTimeout(cb, 5000);
Тем не менее, это не очень хорошее решение, поскольку блокчейн очень непредсказуем, и иногда может занять гораздо больше, чем 2-3 секунды. Что было бы намного лучше, так это следить за изменениями в базе данных. К счастью, база данных написана в Rethink, которая предоставляет объекты курсора, которые обновляются при изменении. Так что это должно быть легко и выглядеть примерно так:
var _wait = cb => () => {
connector.exec(db => db.table('chain_info').changes())
.then(cursor => {
cursor.each((err, change) => {
cb(err);
return false;
});
});
};
Эта настройка нарушает тесты. Насколько я могу судить done
действительно называется Любая консоль входит и вокруг нее срабатывает, и сам тест регистрируется как завершенный, но следующий тест никогда не запускается, и в конечном итоге время истекает:
Manager API Workflow:
Account Creation:
✓ should create a user (6335ms)
1) should login an administrator
1 passing (1m)
1 failing
1) Manager API Workflow: Account Creation: should login an administrator:
Error: timeout of 60000ms exceeded. Ensure the done() callback is being called in this test.
Будем очень благодарны любой помощи. Я использую Mocha 3.1.2, Chai 3.5.0, Supertest 2.0.1 и Node 6.9.1.