Jest测试中Promise返回undefined值问题排查
问题原因
你的代码存在3个直接导致打印undefined的问题:
- 首先是
connect异步方法没有返回值:所有async声明的函数如果没有显式写return语句,执行完成后默认resolve的值就是undefined。你当前的connect方法仅给this.client赋值,没有返回任何内容,哪怕连接成功也拿不到有效返回值。 - 其次是多余的Promise包装逻辑无效:你在
connection函数里手动创建了Promise,但拿到ddbb.connect()返回的pending状态Promise后直接resolve,本质上没有做任何等待连接完成的处理,逻辑冗余。 - 最后是Jest异步测试写法错误:你在test回调里写了Promise链式调用,但没有把这个Promise返回给Jest,Jest会在所有同步代码执行完后直接结束测试,不会等待
then里的回调执行,就算你后面逻辑写对了,也可能因为测试提前退出拿不到打印结果。
修正步骤
- 先修改
connect方法,连接完成后返回当前实例:
async connect(){ this.client = await poolMapping.connect(); return this; }
- 简化
connection函数,去掉多余的Promise包装,因为async函数本身就返回Promise,可以直接返回调用结果:
function connection(){ const ddbb = new PGMappingDDBB(); return ddbb.connect(); }
- 修改测试用例,将Promise返回给Jest,让测试框架等待异步逻辑执行完成:
test("Test 12: Several searches concurrently", () => { return connection().then(ddbb => { console.log(ddbb); // 此处可以正常拿到连接完成的PGMappingDDBB实例 // 后续在这里添加你的业务断言即可 }); });
如果习惯async/await写法,测试用例也可以写成更简洁的形式:
test("Test 12: Several searches concurrently", async () => { const ddbb = await connection(); console.log(ddbb); // 后续写业务断言 });
注意:写Jest异步用例时,要么返回Promise/使用async声明测试回调,要么调用传入的
done回调通知测试完成,否则测试会提前退出,导致异步逻辑不执行、断言不生效。
内容的提问来源于stack exchange,提问作者José Carlos
相关产品推荐
相关产品推荐

