关于前端测试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);
}
};
}