Подтвердить что ты не робот

Как я могу выполнить асинхронные тесты Mocha (NodeJS) в порядке?

Этот вопрос относится к среде тестирования Mocha для NodeJS.

Поведение по умолчанию, похоже, должно начинать все тесты, а затем обрабатывать асинхронные обратные вызовы по мере их поступления.

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

Как я могу это сделать?

4b9b3361

Ответ 1

Дело не в том, что "структурированный код работает в том порядке, в котором вы его структурировали" (изумление!), но, как предлагает @chrisdew, заказы на возврат для асинхронных тестов не могут быть гарантированы. Чтобы переформулировать проблему - тесты, которые находятся дальше по цепочке (синхронное выполнение) , не могут гарантировать, что требуемые условия, заданные асинхронными тестами, будут готовы к моменту их запуска.

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

Оберните зависимые тесты в блоке и запустите для них async before (обратите внимание на "done" в предыдущем блоке):

var someCondition = false

// ... your Async tests setting conditions go up here...

describe('is dependent on someCondition', function(){

  // Polls `someCondition` every 1s
  var check = function(done) {
    if (someCondition) done();
    else setTimeout( function(){ check(done) }, 1000 );
  }

  before(function( done ){
    check( done );
  });

  it('should get here ONLY once someCondition is true', function(){ 
    // Only gets here once `someCondition` is satisfied
  });

})

Ответ 2

Я удивляюсь тому, что вы написали, когда я использую. Я использую mocha с тестами стиля bdd (описать/он) и просто добавил некоторые тесты console.logs в свои тесты, чтобы проверить, сохраняются ли ваши претензии в моем случае, но, похоже, они этого не делают.

Вот фрагмент кода, который я использовал для просмотра порядка "end1" и "start1". Они были надлежащим образом заказаны.

describe('Characters start a work', function(){
    before(function(){
      sinon.stub(statusapp, 'create_message');
    });
    after(function(){
      statusapp.create_message.restore();
    });
    it('creates the events and sends out a message', function(done){
      draftwork.start_job(function(err, work){
        statusapp.create_message.callCount.should.equal(1);
        draftwork.get('events').length.should.equal(
          statusapp.module('jobs').Jobs.get(draftwork.get('job_id')).get('nbr_events')
        );
        console.log('end1');
        done();
      });
    });
    it('triggers work:start event', function(done){
      console.log('start2');
      statusapp.app.bind('work:start', function(work){
        work.id.should.equal(draftwork.id);
        statusapp.app.off('work:start');
        done();
      });

Конечно, это могло произойти и случайно, но у меня много тестов, и если они будут работать параллельно, у меня определенно будут условия гонки, которых у меня нет.

Пожалуйста, обратитесь к этой проблеме из журнала отслеживания мокко. В соответствии с этим тесты выполняются синхронно.

Ответ 3

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

Мы используем promises в нашем приложении, и это упростило структуру тестов. Ключ, однако, все же должен отложить выполнение с помощью before hook:

var assert = require( "assert" );

describe( "Application", function() {
  var application = require( __dirname + "/../app.js" );
  var bootPromise = application.boot();

  describe( "#boot()", function() {
    it( "should start without errors", function() {
      return bootPromise;
    } );
  } );

  describe( "#shutdown()", function() {
    before( function() {
      return bootPromise;
    } );

    it( "should be able to shut down cleanly", function() {
      return application.shutdown();
    } );
  } );
} );

Ответ 4

использовать mocha-steps

он сохраняет тесты последовательно, независимо от того, являются ли они асинхронными или нет (т.е. ваши функции done все еще работают точно так же, как и они). Это прямая замена для it, и вместо этого вы используете step