以下是如何实现一个测试套件的实现,该测试套件使用Jon Resig的书籍Secrets of JavaScript Ninja中的中央计时器控件执行异步测试。
(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()
,然后使用{{1}继续调用runTest()
}。对我来说就像一个无限循环。有人可以解释一下吗?
答案 0 :(得分:1)
[...]简历依次使用
runTest()
来调用setTimeout()
。
是的,但是runTest()
没有做任何事情(因为queue.length
将是0
,这是假的):没有新的测试运行,没有进一步调用{{1没什么。