2

以下是如何实现一个测试套件的实现,该套件使用来自Jon Resig 的《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>

我知道推入队列的每个函数都需要在异步调用之前调用,并且需要在异步调用结束之后调用。但是我看不到测试套件将如何结束。在最后一个测试结束时,flag 的值将是 false,因为最后一个测试会在完成自身后调用,并依次用 a调用 resume 。在我看来就像一个无限循环。有人可以解释一下吗?pause()resume()pauseresume()runTest()setTimeout()

4

1 回答 1

1

[...] resume 依次runTest()调用setTimeout().

是的,但是runTest()没有做任何事情(因为queue.lengthwill be 0,这是虚假的):没有运行新的测试,没有进一步调用resume(),什么都没有。

于 2013-07-28T18:27:21.630 回答