以下是如何实现一个测试套件的实现,该套件使用Jon Resig的《JavaScript忍者的秘密》一书中的中央计时器控件执行异步测试。
(function() {
var queue = [], paused = false; //#1
this.test = function(fn) { //#2
queue.push(fn);
runTest();
};
this.pause = function() { //#3
paused = true;
};
this.resume = function() { //#4
paused = false;
setTimeout(runTest, 1);
};
function runTest() { //#5
if (!paused && queue.length) {
queue.shift()();
if (!paused) resume();
}
}
})();
这就是作者将test()
函数设置为其步长的方式:
test(function() {
pause();
setTimeout(function() {
assert(true, "First test completed");
resume();
}, 100);
});
test(function() {
pause();
setTimeout(function() {
assert(true, "Second test completed");
resume();
}, 200);
});
</script>
据我所知,被推入队列的每个函数都需要在异步调用之前调用pause()
,在异步调用结束后调用resume()
。但我不知道测试套件将如何结束。在最后一次测试结束时,pause
标志的值将为false,因为最后一次的测试将在完成自身之后调用resume()
,并继续使用setTimeout()
调用runTest()
。在我看来就像一个无限的循环。有人能解释一下吗?
[…]resume依次用
setTimeout()
调用runTest()
。
是的,但runTest()
什么都不做(因为queue.length
将是0
,这是错误的):没有运行新的测试,没有对resume()
的进一步调用,什么都没有。