我有一套测试,其中包含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
});
});
答案 0 :(得分:4)
根本原因是默认情况下Mocha 认为套件是"完成"当Node认为该过程是"完成"。并且默认情况下节点等待所有未清除的超时和间隔完成"完成"在调用流程之前"完成"。 ("未清除"超时或间隔是已创建且从未调用过clearTimeout/clearInterval
的那个。)
当你传递给setTimeout
的回调已经完成执行时,超时完成,但是一个间隔永远不会完成,因为按照设计它会永远地调用它的回调。
您的选择是:
确定应清除间隔的条件,并使用clearInterval
清除它。
对setInterval
的返回值使用unref
。这告诉Node在决定过程是否完成时忽略间隔"
使用mocha
选项(在Mocha 4中引入)调用--exit
,当Mocha完成测试套件时强制退出进程。
我会使用选项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();
});
});
});
});