Async Mocha: `done` вызывается, но следующий тест никогда не запускается

У меня нетрадиционная настройка, которую я не могу изменить. Это выглядит примерно так:

  1. проверить POST на сервер
  2. POSTs сервера к блокчейну
  3. обновления блокчейна
  4. скрипт синхронизации обновляет базу данных

Абсолютно необходимо, чтобы я не запускал следующий тест до тех пор, пока он не завершит весь этот рабочий процесс, который обычно занимает 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.

0 ответов

Другие вопросы по тегам