当使用setInterval测试功能时,Mocha和Chai测试失败
问题描述:
我刚接触TDD并与Mocha和Chai一起工作。我创建了一个测试,当一个值增加时通过,但是当这个增加被放在一个setInterval中时,它会失败。这段代码的目的是让屏幕上有东西移动。当使用setInterval测试功能时,Mocha和Chai测试失败
function startMovingThing(){
var position = setInterval(function() {
moveThing(10);
}, 100);
}
function moveThing(number){
thing.position += number;
thingOnScreen.style.left = thing.position + 'px';
}
测试:
describe('Thing', function() {
it('should increase position', function(){
assert.increases(startMovingThing, thing, 'position');
});
});
我怎样才能得到这个测试(或应该测试什么)通过?
我不希望moveThing()超出间隔,因为如果间隔被清除并且函数被调用,那么这个东西就不应该移动。
答
好的,问题是你正在使用setInterval,它是异步的,你试图断言该值是以同步方式改变的。
下面是您测试的修改版本,使用sinonjs来模拟时间流逝。
var assert = require('chai').assert;
var sinon = require('sinon');
var thing = { position: 0 }
var thingOnScreen = { style: { left: '' } };
function startMovingThing(){
var position = setInterval(function() {
moveThing(10);
}, 100);
}
function moveThing(number){
thing.position += number;
thingOnScreen.style.left = thing.position + 'px';
}
describe('Thing', function() {
beforeEach(function() {
this.clock = sinon.useFakeTimers();
});
afterEach(function() {
this.clock = sinon.restore();
});
it('should increase position', function(){
startMovingThing();
this.clock.tick(101);
assert.equal(thing.position, 10);
});
});
总之,sinonjs正在取代的setInterval的全局功能,并执行代码,而无需等待指定毫秒。
+0
定义好的答案,我有一个问题。我将调用pass作为参数传递给it方法,并在assert语句后调用它。 – marty
上面的代码不清楚代码应该如何工作。 是从一个断言库增加一个函数吗?事物是在哪里定义的? – vintem
增加来自Chai断言库。事情是在我的javascript – Birdman