使用Sinon的假定时器时不会触发setTimeout

时间:2017-03-27 14:12:53

标签: javascript node.js promise settimeout sinon

我的测试类似于下面显示的测试。基本上我想测试特定方法是否会延迟。

以下示例按预期工作,即调用resolve方法并且测试通过:

it(`should delay execution by 1 second`, function () {
  const clock = sandbox.useFakeTimers();

  const p = new Promise(function (resolve) {
    setTimeout(resolve, 1000);
  });

  clock.tick(1000);

  return p;
});

但是,如果我将setTimeout包装在另一个Promise中,则决不会调用该解析:

it(`should delay execution by 1 second`, function () {
  const clock = sandbox.useFakeTimers();

  const p = Promise.resolve()
    .then(() => {
      return new Promise(function (resolve) {
        setTimeout(resolve, 1000); // resolve never gets called
      });
    });

    clock.tick(1000);

    return p;
  });

这里有什么问题?

我在Sinon 2.1.0上使用Node 6.9.5和原生承诺。

1 个答案:

答案 0 :(得分:11)

问题似乎是你在超时开始之前勾选时钟 - 这是在你的第二个片段中的一个回应中异步发生的。

这应该有效:

it(`should delay execution by 1 second`, function () {
  const clock = sandbox.useFakeTimers();

  return Promise.resolve().then(() => {
    return new Promise(function (resolve) {
      setTimeout(resolve, 1000); // resolve never gets called
      clock.tick(1000);
    });
  });
});