簡體   English   中英

使用setInterval測試函數時,Mocha和Chai測試失敗

[英]Mocha and Chai test fails when testing function with setInterval

我是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';
}

測試:

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的全局功能,並且無需等待指定的毫秒即可執行代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM