sinon.useFakeTimers不会引发超时

时间:2015-03-02 21:46:17

标签: javascript casperjs sinon

我正在尝试使用Sinon和CasperJS测试我的超时功能。此页面显示在数字标牌上,因此它不是典型的网页 - 它的使用寿命很长,因此超时值很高。

以下是我要测试的相关代码:

RiseVision.Image = (function () {
  // Private
  function startTimer() {
    setTimeout(function() {
      var img = document.getElementById("image");
      img.style.backgroundImage = "url(http://s3.amazonaws.com/images/logo-small.png?" + new Date().getTime() + ")";
    }, 900000);
  }

  // Public
  function ready() {
    ...
  }

  return {
    "ready": ready
  };
})();

我正在使用CasperJS进行我的测试:

var e2ePort = system.env.E2E_PORT || 8099;
var url = "http://localhost:"+e2ePort+"/src/widget-e2e.html";
var clock;

casper.test.begin("Image Widget - e2e Testing", {
  test: function(test) {
    casper.start();

    casper.thenOpen(url, function () {
      test.assertTitle("Image Widget", "Test page has loaded");
    });

    casper.then(function () {
      casper.waitFor(function waitForUI() {
        return this.evaluate(function loadImage() {
          // Wait for the background image to be set.
          return document.getElementById("image").getAttribute("style") !== "";
        });
      },
      function then() {
        // Do some assertions here.

        casper.waitFor(function waitForTimer() {
          return this.evaluate(function expireTimer() {
            clock = sinon.useFakeTimers();
            clock.tick(900000);

            return document.getElementById("image").getAttribute("style") !==
          "background-image: url(http://s3.amazonaws.com/images/logo-small.png);";
          });
        },
        function then() {
          // More assertions here.
        });
      });
    });

    casper.run(function runTest() {
      test.done();
    });
  }
});

我知道这个函数正在执行,因为我可以成功地从它内部记录消息,但它只是没有触发我的计时器。如果我将startTimer函数公开,似乎没有任何区别。

有什么想法吗?

THX。

已编辑 - 已更新以包含更多代码。

1 个答案:

答案 0 :(得分:0)

您可能意味着使用单个时钟实例而不是每50毫秒创建一个(这是waitFor所做的)。

casper.evaluate(function() {
    window._fakeClock = sinon.useFakeTimers();
});

casper.waitFor(function waitForTimer() {
  return this.evaluate(function expireTimer() {
    window._fakeClock.tick(900001);

    return document.getElementById("image").getAttribute("style") !==
  "background-image: url(http://s3.amazonaws.com/images/logo-small.png);";
  });
},
function then() {
  this.evaluate(function() {
      window._fakeClock.restore();
  });

  // More assertions here.
});