当setInterval(...)运行

时间:2018-01-09 16:14:12

标签: javascript node.js windows unit-testing mocha

我有一套测试,其中包含setInterval(...)调用的代码。

当通过windows powershell命令行在mocha中运行此代码时,所有测试都将运行,但测试运行器将在之后无限期挂起。

我使用的命令是mocha "./unitTests/**/*.js"

有没有办法迫使测试跑步者关闭?

或者,有没有办法确定代码是否在测试环境中运行,以便我可以禁用setInterval(...)次调用?

示例代码:

// MODULE TO TEST
setInterval(function(){
    // do cleanup task
}, 1000000);

function testFunction(){
    return "val";
}

export {
    testFunction
}

// TEST MODULE
describe("Test setInterval", function() {  
    it("should finish", function() {
        testFunction().should.be.equal("val");

        // This test will complete and all others, but the entire suite will not
    });
});

2 个答案:

答案 0 :(得分:4)

根本原因是默认情况下Mocha 认为套件是"完成"当Node认为该过程是"完成"。并且默认情况下节点等待所有未清除的超时和间隔完成"完成"在调用流程之前"完成"。 ("未清除"超时或间隔是已创建且从未调用过clearTimeout/clearInterval的那个。)

当你传递给setTimeout的回调已经完成执行时,超时完成,但是一个间隔永远不会完成,因为按照设计它会永远地调用它的回调。

您的选择是:

  1. 确定应清除间隔的条件,并使用clearInterval清除它。

  2. setInterval的返回值使用unref。这告诉Node在决定过程是否完成时忽略间隔"

  3. 使用mocha选项(在Mocha 4中引入)调用--exit,当Mocha完成测试套件时强制退出进程。

  4. 我会使用选项1或2.第三个选项有效但如果您的测试套件变得更复杂,它可能会隐藏您应该处理的问题。如果有一个可以使用的更集中的解决方案,我就不会使用它。

答案 1 :(得分:0)

你可以使用done()来结束测试,就像这个例子一样:

describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done){
      var user = new User('Luna');
      user.save(function(err) {
        if (err) done(err);
        else done();
    });
   });
  });
});