[英]How to cover setInterval in the unit test case in javascript
嗨,我正在编写此功能的单元测试用例。 当我从单元测试用例运行此函数时,它涵盖了所有语句,但没有涵盖setInterval
完整行。
有谁知道如何用javascript覆盖它? 我正在使用摩卡咖啡。
const open = async function (config) {
...... set of lines..
let retryIn = setInterval(async () => {
try {
client = await connect(config);
clearInterval(retryIn);
return client;
} catch (err) {
//error
}
}, 20000);
};
我只是这样称呼它
it("###test", async () => {
open(config);
});
});
首先,如果要重试失败的任务,则永远不要使用setInterval
。 您应该改用setTimeout
。
除此之外,您无法从经典的回调基础函数(如setInterval
或setTimeout
返回值。 因此,以当前形式,调用open
时返回的promise将在建立任何连接之前得到解决。
使用await
/ async
您可以为这种情况创建干净而简单的设置:
function wait(seconds) { return new Promise((resolve, _) => setTimeout(resolve, seconds)) } async function connect() { throw new Error('failed') } async function open(config) { let client; while (client === undefined /* || retries > maxRetries*/ ) { try { client = await connect(config); } catch (err) { // if connection failed due to an error, wait n seconds and retry console.log('failed wait 2 seconds for reconnect'); await wait(2000) // ++retries } } if (!client) { throw new Error('connection failed due to max number of retries reached.') } return client } async function main() { let connection = await open() } main().catch(err => console.log(err))
您可以通过添加重试限制来进一步扩展此代码段。 有关如何实现的粗略想法,请参见评论。
要测试上面的代码,您可以编写:
it("###test", function() {
return open(config);
});
有人发布了有关假计时器的答案,然后将其删除,答案是正确的,因此我再次发布了。
您可以使用sinonjs
创建假计时器
虚假计时器是setTimeout和好友的同步实现,Sinn.JS可以使用它们来覆盖全局函数,从而使您可以更轻松地使用它们测试代码
但是从您的代码看来,您似乎正在尝试在异步代码中测试异步代码,可以像这样实现
describe('somthing', () => {
it('the result is 2', async () => {
const x = await add(1, 1)
expect(x).to.equal(4);
});
});
与您的代码更接近
async function open() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('done')
}, 1000);
});
};
describe('somthing', () => {
it('###test', async () => {
const x = await open()
chai.expect(x).to.equal("done");
});
});
只是包装到Promise
const open = async function (config) {
...... set of lines..
return new Promise((resolve, reject) => {
let retryIn = setInterval(async () => {
client = await connect(asConfigParam);
clearInterval(retryIn);
return client;
}, 20000);
return resolve(retryIn);
});
};
it("###test", async () => {
const result = await open(config);
console.log('result', result)
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.