您好,我正在编写此功能的单元测试用例。当我从单元测试用例运行此函数时,它涵盖了所有语句,但没有涵盖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);
});
});
答案 0 :(得分:2)
首先,如果要重试失败的任务,则永远不要使用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);
});
答案 1 :(得分:1)
有人发布了有关假计时器的答案,然后将其删除,答案是正确的,所以我再次发布了。
您可以使用sinonjs
创建假计时器
假计时器是setTimeout和friends的同步实现 Sinon.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");
});
});
答案 2 :(得分:0)
只需包装到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)
});