使用setTimeout()暂停Mocha测试

时间:2013-07-26 18:24:07

标签: mocha

我使用Mocha为Node API编写测试。在一个测试中,我需要执行2个操作并比较每个操作的时间戳并确保它们不同。为此,我需要可靠地暂停测试执行至少一秒钟。我试图在第二次调用setTimeout之前使用ping暂停Mocha执行,但它没有发生。

it( 'should insert then update the timestamp.', function( done ) {
  Do.ping( 'arg1', function( err, result ) {
    should.not.exist( err );

    setTimeout( Do.ping( 'arg1', function( err, result ) {
      // Test that the timestamp of the first ping is before the timestamp
      // of the second ping (among other things)
      done();
    }), 1000 );
  });
});

任何人都能看到我在这里蠢蠢欲动吗?或者,是否有更好的(即更多Mocha-ish)方式来做我想做的事情?

3 个答案:

答案 0 :(得分:2)

我最终使用了Sinon的假计时器API,它一直运行良好。分别在beforeEach()afterEach()中实例化并重置假计时器。在实际测试中,只需按照您需要的方式推进时钟:

clock.tick( 180000 ); // Advances the JS clock 3 minutes (180 seconds)

答案 1 :(得分:0)

让我建议一个(未经测试的)替代方案:

var async = require('async')
it( 'should insert then update the timestamp.', function( done ) {
  async.series([
  Do.ping( 'arg1', function( err, result ) {
    should.not.exist( err );
  },
  setTimeout(console.log('waiting'),1000);
  },
  Do.ping( 'arg2', function( err, result ) {
    should.not.exist( err );
  },
  done();]
  });
});

我认为通过使用async.series,您将能够更可靠地暂停mocha进入第二次调用。

答案 2 :(得分:-1)

我已使用sleepfor添加了npm install sleepfor包。在我的测试中,我有以下内容:

const sleepfor = require('sleepfor');

describe('My Test', function() {
    it('should test something here.', function(){
        // Run some test code here.
    });
    it('should test something ELSE here.', function(){
        // Run different test code here.
    });

    afterEach(function(){
        var d = new Date();
        console.log(d.toLocaleString() + " >> Before sleep.");
        sleepfor(5000);

        var d = new Date();
        console.log(d.toLocaleString() + " >> After sleep.");
    });
});

应该是显而易见的,但为了以防万一,在每次阻止执行后调用afterEach