sinonjs与测试时间

关于前端测试Mocha和chai.js简单地进行了测试的入门,然后发现作者用了一下sinonjs来辅助测试,这里主要针对模拟时间

Standalone test spies, stubs and mocks for JavaScript.No dependencies, works with any unit testing framework.

独立测试javascript的spies,stubs,mocks,不依赖于任何单元测试的框架。

下面的这个例子是实现一个定时器,输入开始时间和结束时间,然后时钟就会自动定时输出数字,每隔十分之一秒要跳动数字

对于这个功能,主要有两个测试,一个是输出,一个是定时的功能,此外能够正常结束也是有必要的。

首先要重写时钟和console.log,在开始和结尾

 beforeEach(function () {
    nums = [];

    if (typeof console === 'undefined') {
      console = {
        log: null
      };
    }
    origConsoleLog = console.log;
    console.log = function (val) {
      nums.push(val);
    };
    //重写 console.log

    this.clock = sinon.useFakeTimers();
   //加载假时钟
  });

  afterEach(function () {
    console.log = origConsoleLog;
   //还原console.log
    this.clock.restore();
      //还原时钟
  });

第一个测试用例测试功能

我们选择用Num数组来存储console.log的输入,同时测试根据时间输出的准确性,同时测试输出内容的准确性

  it('should count from start number to end number, one per 1/10th of a second', function () {
    this.timeout(600);
 
    countAnswers.count(1, 5);

    for (var i = 1; i <= 5; i++) {
      expect(nums.length).to.eql(i);

      this.clock.tick(100);
    }

    expect(nums.length).to.eql(5);
    expect(nums[0]).to.eql(1);
    expect(nums[4]).to.eql(5);
  });

第二个测试 cancel

  it('should provide a method to cancel the counting', function () {
    this.timeout(600);

    var counter = countAnswers.count(1, 5);
    counter.cancel();

    this.clock.tick(550);

    expect(nums.length < 5).to.be.ok;
  });

我实现的代码

count: function (start, end) {
   var num = start;
   console.log(num);
   var timer = setInterval(function () {
     num = num+1;
     console.log(num);
     if(num===end){
       clearInterval(timer);
     }
   },100);
   return {
     cancel:function () {
       timer && clearInterval(timer);
     }
   };
 }

作者给出来的代码,我用的是setInterval,作者用的是setTimeout

count: function (start, end) {
  var timeout;
  function doIt () {
    console.log(start++); // eslint-disable-line no-console

    if (start <= end) {
      timeout = setTimeout(doIt, 100);
    }
  }

  doIt();

  return {
    cancel: function () {
      timeout && clearTimeout(timeout);
    }
  };
}

你可能感兴趣的:(sinonjs与测试时间)