【问题标题】:Mocha and Chai test fails when testing function with setInterval使用 setInterval 测试功能时,Mocha 和 Chai 测试失败
【发布时间】:2016-03-03 17:13:58
【问题描述】:

我是 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() 超出区间,因为如果清除区间并调用函数,则事物不应移动。

【问题讨论】:

  • 对于上面的代码,不清楚代码应该如何工作。是从断言库中增加一个函数吗?事物在哪里定义?
  • increases 来自 Chai 断言库。事情是在我的javascript中定义的

标签: javascript tdd mocha.js chai


【解决方案1】:

好的,问题是您使用的是异步的 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 的全局功能,并且正在执行代码而无需等待指定的毫秒数。

【讨论】:

  • 很好的答案,我遇到了一个问题。我将传入的 done 作为参数调用到 it 方法中,并在 assert 语句之后调用它。
猜你喜欢
  • 2023-03-08
  • 2020-08-18
  • 2013-04-11
  • 2019-10-25
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多