如何为setInterval()函数编写测试用例

Ton*_*ieh 5 javascript mocha.js

我有一个计时器,并假设当计数器计数到3时将执行特定的功能.

var a_interval_function = function(){
    var counter = 1;
    var interval = setInterval(function(){
        if(counter === 5){
            clearInterval(interval);
        }

        // run the function when the counter is 3
        if(counter === 3){
            a_function_should_be_runned();
        }   

        counter++;
    }, 500);

    return interval;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何建立一个有效的测试用例来测试计数器以及执行函数的时间.有谁知道怎么做?类似于以下内容:

// and some test case like this
it('a timer test', function(done){
    var interval = a_interval_function();
    expect(a_function_should_be_runned.state).to.equal({
        name: 'runned',
        counter: 3,
        time: 300,
    });
});
Run Code Online (Sandbox Code Playgroud)

谢谢.

rob*_*lep 7

也许你可以使用sinon.useFakeTimers().

例如:

var sinon  = require('sinon');
var expect = require('chai').expect;

var a_function_should_be_runned = sinon.spy();

var a_interval_function = function(){
  var counter = 1;
  var interval = setInterval(function(){
    if(counter === 5){
      clearInterval(interval);
    }

    // run the function when the counter is 3
    if(counter === 3){
      a_function_should_be_runned();
    }   

    counter++;
  }, 500);

  return interval;
}

describe('timer tests', function() {

  before(function() {
    this.clock = sinon.useFakeTimers();
  });

  after(function() {
    this.clock.restore();
  });

  it('a timer test', function() {
    var interval = a_interval_function();

    // At time 0, we don't expect the function to have been called.
    expect(a_function_should_be_runned.called).to.be.false;

    // Advance clock 500ms.
    this.clock.tick(500);
    expect(a_function_should_be_runned.called).to.be.false;

    // Advance clock again (1s since start)
    this.clock.tick(500);
    expect(a_function_should_be_runned.called).to.be.false;

    // Advance clock again (1.5s since start). This should
    // trigger the call to `a_function_should_be_runned`.
    this.clock.tick(500);
    expect(a_function_should_be_runned.called).to.be.true;
  });
});
Run Code Online (Sandbox Code Playgroud)