使用 setInterval 测试功能时,Mocha 和 Chai 测试失败
Mocha and Chai test fails when testing function with setInterval
我是 TDD 的新手,正在使用 Mocha 和 Chai。我创建了一个测试,该测试在值增加时通过,但是当该增加值置于 setInterval 内时,它失败了。此代码的 objective 是让某些东西在屏幕上移动。
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() 在区间之外,因为如果区间被清除并调用函数,thing 不应该移动。
好的,问题是您使用的是异步的 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 的全局功能,并且无需等待指定的毫秒数即可执行代码。
我是 TDD 的新手,正在使用 Mocha 和 Chai。我创建了一个测试,该测试在值增加时通过,但是当该增加值置于 setInterval 内时,它失败了。此代码的 objective 是让某些东西在屏幕上移动。
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() 在区间之外,因为如果区间被清除并调用函数,thing 不应该移动。
好的,问题是您使用的是异步的 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 的全局功能,并且无需等待指定的毫秒数即可执行代码。