如何在JavaScript中正确导入异步module.exports函数并解决测试中的await使用报错问题
解决Jest测试中无法await异步函数的问题
你的问题根本不是导入方式的问题,而是测试函数本身没标记为异步,导致await无法正常工作,Jest也没法正确等待异步操作完成,才会出现那些误导人的报错(比如提示func不是异步函数)。
先给你修正后的测试代码,完全不用改index.js:
const exportedModule = require('./index'); // 核心改动:给test的回调函数加上async关键字 test('Successfully execute func when empty object passed', async () => { const obj = {}; const expectedReturn = { statusCode: 200, body: JSON.stringify({ message: 'Success!', input: obj, }), }; const actualReturn = await exportedModule.func(obj); console.log(actualReturn); // 额外提醒:用toEqual代替toBe,因为toBe检查对象引用,而我们需要比较内容 expect(actualReturn).toEqual(expectedReturn); });
为什么之前会报错?
Jest的测试回调如果要使用await,必须把这个函数声明为async——否则JS引擎会直接抛出语法错误,Jest也会误以为异步操作没完成就结束了测试,进而出现各种混乱的报错信息(比如误判func不是异步函数)。
另外你之前用toBe比较两个对象的写法也有问题:toBe是严格比较引用地址,而actualReturn和expectedReturn是两个独立的对象实例,哪怕内容完全一样,toBe也会判定不相等。换成toEqual就能递归比较对象的所有属性值,符合你的测试预期。
你的导入方式完全没问题,require('./index')已经正确获取到了导出的模块,func确实是异步函数,所有调整都只在测试文件里完成就好。
内容的提问来源于stack exchange,提问作者Sabo Boz
相关产品推荐
相关产品推荐

