Сделайте Mocha перед запуском следующего теста

У меня есть несколько тестов мокко, которые требуют данных от предыдущих вызовов функций. Однако, поскольку мой код использует веб-сервис, я бы хотел, чтобы он ожидал определенное количество времени, прежде чем запускать следующий тест.

Примерно так:

var global;

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

wait(30000); // basically block it from running the next assertion

it('should give more info', function(done) {
  run.anotherMethod(global, function(err, result) {
    expect(result).to.be.an('object');
  done();
  });
});

Любые идеи будут оценены. Спасибо!

Ответ 1

setTimeout определенно может помочь, но может быть и более "чистый" способ сделать это.

Документация здесь фактически говорит об использовании this.timeout(delay), чтобы избежать ошибок тайм-аута при тестировании асинхронного кода, поэтому будьте осторожны.

var global;

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

it('should give more info', function(done) {
    this.timeout(30000);

    setTimeout(function () {
      run.anotherMethod(global, function(err, result) {
        expect(result).to.be.an('object');
        done();
      });
    }, 30000);
 });

Ответ 2

Пока this.timeout() продлит тайм-аут одного теста, это не ответ на ваш вопрос. this.timeout() устанавливает тайм-аут текущего теста.

Но не волнуйтесь, вы все равно должны быть в порядке. Тесты не выполняются параллельно, они выполняются последовательно, поэтому у вас не должно быть проблем с вашим глобальным подходом.

Ответ 3

Прежде всего, для правильного модульного тестирования вам никогда не нужно спать между тестами. Если вам нужен режим сна, это означает, что тестируемым функциям требуется задержка перед завершением ожидаемой задачи, которая должна быть обработана внутри этой функции с некоторым асинхронным ожиданием или сном. После выхода из функции ее срок жизни должен закончиться, и ожидаемый результат должен быть получен немедленно.

Ответ 4

Во-первых:

Эта тема имеет отличные ответы! Мне лично понравился ответ @Flops (получил мой upvote)

Во-вторых:

Чтобы прояснить это (насколько это возможно), приведу пример кода, очень похожий на тот, который я получил (проверен и проверен)

function delay(interval) 
{
   return it('should delay', done => 
   {
      setTimeout(() => done(), interval)

   }).timeout(interval + 100) // The extra 100ms should guarantee the test will not fail due to exceeded timeout
}

it('should give some info', function(done) {
  run.someMethod(param, function(err, result) {
    global = result.global
  done();
  });
});

delay(1000)

it('should give more info', function(done) {
  run.anotherMethod(global, function(err, result) {
    expect(result).to.be.an('object');
  done();
  });
});

Примечание: вы также можете использовать функции задержки одну за другой, сохраняя согласованность (порядок тестирования)

Ответ 5

Вот еще один, используя обещания:

it('go, then stop', (done) => {
// this.skip();
go()
  .then((response) => { console.log('go was called'); return response; })
  .then(response => response.should.equal('acknowledged'))
  .then(() => new Promise(resolve => setTimeout(() => { resolve(); }, 3000)))
  .then(() => console.log('3 second wait is over'))
  .then(() => stop())
  .then(response => response.should.equal('acknowledged'))
  .then(() => done());
  }).timeout(15000);