Sinon clock.tick不会提前setTimeout的时间

时间:2019-04-29 15:13:57

标签: javascript node.js sinon

我正在为async函数编写测试,该函数执行一系列任务,并且在执行更多任务之前,至少要等待60秒。我试图使用sinon.useFakeTimers()跳过这60秒,以便可以在延迟后测试逻辑。

foo.js

module.exports.foo = async f => {
  // ... more code ...
  await new Promise((resolve, reject) => {
    setTimeout(resolve, 60000);
  });
  // ... more code ...
  f();
  // ... more code ...
};

test-foo.js

const sinon = require('sinon');
const expect = require('chai').expect;

const { foo } = require('./foo');

describe('Module Foo ', function() {
  it('call function after 1 minute', function() {
    var clock = sinon.useFakeTimers();
    const bar = sinon.stub();

    foo(bar);
    expect(bar.called).to.be.false;
    clock.tick(100000);
    expect(bar.called).to.be.true; // this one fails
  });
});

我曾尝试将sinon.useFakeTimers();放在其他地方,但是Promise不能解决,并且我传递给foo的存根也不会被调用。

1 个答案:

答案 0 :(得分:1)

在提前时钟以使{{1中的async已排队的await回调之后,使测试函数PromisePromise解析为await }}在声明之前可以运行:

foo

有关完整的详细信息,请参见my answer here,它使用const sinon = require('sinon'); const expect = require('chai').expect; const { foo } = require('./foo'); describe('Module Foo ', function() { it('call function after 1 minute', async function() { // <= async test function var clock = sinon.useFakeTimers(); const bar = sinon.stub(); foo(bar); expect(bar.called).to.be.false; // Success! clock.tick(100000); await Promise.resolve(); // <= give queued Promise callbacks a chance to run expect(bar.called).to.be.true; // Success! }); }); Jest timer mocks,但是概念相同,也适用于Jest和{{1} } fake timers