Mog*_*lum 3 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 ...
};
Run Code Online (Sandbox Code Playgroud)
测试 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
});
});
Run Code Online (Sandbox Code Playgroud)
我尝试sinon.useFakeTimers();在其他各种地方放置,但 Promise 没有解析,并且我传入的存根foo没有被调用。
让你的测试功能async和await一个解决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!
});
});
Run Code Online (Sandbox Code Playgroud)
有关完整的详细信息,请参阅我在此处使用的答案Jest和Jest 计时器模拟,但概念是相同的,也适用于Mocha和Sinon 假计时器。
| 归档时间: |
|
| 查看次数: |
2214 次 |
| 最近记录: |