Node.js异步函数如何正确返回数据?解决Jest测试报错问题
问题:Jest测试异步函数时出现日志延迟报错
我编写了如下异步函数:
async function example(){ let data = await another_function(); var ws = fs.createWriteStream('path'); let jsonData = [{'id':'1234', 'name': 'Alex'}]; fastcsv .write(jsonData, { headers: true }) .on("finish", function() { console.log('success'); }) .pipe(ws) return true; }
但使用Jest执行测试时出现报错:
Cannot log after tests are done. Did you forget to wait for something async in your test?
Attempted to log "success".
测试函数代码如下:
test('success', async() => { var expected = true; var result = await example(); assert.equal(result, expected); })
请问如何修改example函数,使其能被正确await,直到返回true,解决Jest测试报错问题?
解决方案
问题核心是原函数里的fastcsv流写入是异步操作,但函数未等待该操作完成就直接返回true。Jest测试拿到返回值后就终止了,可此时流的finish事件还未触发,导致后续日志在测试结束后才输出,从而触发报错。
修改思路是将流操作包装为Promise,仅当流的finish事件触发时才resolve,确保await能等待整个写入流程完成。同时需监听error事件,避免Promise长期处于pending状态。
修改后的example函数:
async function example() { let data = await another_function(); var ws = fs.createWriteStream('path'); let jsonData = [{'id':'1234', 'name': 'Alex'}]; return new Promise((resolve, reject) => { fastcsv .write(jsonData, { headers: true }) .on("finish", function() { console.log('success'); resolve(true); }) .on("error", function(err) { reject(err); }) .pipe(ws); // 监听写入流的错误,防止遗漏异常 ws.on("error", function(err) { reject(err); }); }); }
修改后,await example()会等待整个CSV写入操作完成(包括finish事件触发)才返回结果,Jest测试会等到操作结束后再终止,success日志能在测试结束前正常输出,不会再出现报错。
内容的提问来源于stack exchange,提问作者Bimbo
相关产品推荐
相关产品推荐

