Sinon clock.tick没有为setTimeout提前时间

问题描述 投票:1回答:1

我正在为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 ...
};

测试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的存根不会被调用。

javascript node.js sinon
1个回答
1
投票

在推进你的时钟之后让你的测试函数asyncawait成为一个解决的Promise,让Promise排队的await回调在你做出断言之前有机会运行:

foo

有关完整的详细信息,请参阅使用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! }); }); my answer here JestJest,但概念相同,也适用于timer mocksMocha Sinon

© www.soinside.com 2019 - 2024. All rights reserved.