2016-03-03 139 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

相關問題