我正在为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
的存根也不会被调用。
答案 0 :(得分:1)
在提前时钟以使{{1中的async
已排队的await
回调之后,使测试函数Promise
和Promise
解析为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。