使用setInterval测试函数时,Mocha和Chai测试失败

Mik*_*ird 3 javascript tdd mocha.js chai

我是TDD的新手,并与Mocha和Chai合作.我创建了一个在值增加时传递的测试,但是当该增加放在setInterval中时,它会失败.此代码的目标是让某些内容在屏幕上移动.

function startMovingThing(){
    var position = setInterval(function() {
        moveThing(10);
    }, 100);
}

function moveThing(number){
    thing.position += number;
    thingOnScreen.style.left = thing.position + 'px';
}
Run Code Online (Sandbox Code Playgroud)

测试:

describe('Thing', function() {

    it('should increase position', function(){
        assert.increases(startMovingThing, thing, 'position');
    });

});
Run Code Online (Sandbox Code Playgroud)

如何通过此测试(或测试应该是什么)?

我不希望moveThing()超出间隔,因为如果间隔被清除并且函数被调用,那么事物就不应该移动.

thi*_*ple 7

好吧,问题是你正在使用异步的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);
  });
});
Run Code Online (Sandbox Code Playgroud)

总之,sinonjs正在替换setInterval的全局功能,并且无需等待指定的毫秒即可执行代码.