2016-03-03 116 views
3

我刚接触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()超出间隔,因为如果间隔被清除并且函数被调用,那么这个东西就不应该移动。

+0

上面的代码不清楚代码应该如何工作。 是从一个断言库增加一个函数吗?事物是在哪里定义的? – vintem

+0

增加来自Chai断言库。事情是在我的javascript – Birdman

回答

5

好的,问题是你正在使用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

相关问题