Jest & Supertest测试接口超时无响应问题排查求助
问题分析与解决建议
核心问题
测试超时是因为路由代码在数据库操作环节卡住,未向测试用例返回响应,而Insomnia正常是因为开发环境数据库连接/数据状态正常,测试环境存在差异。
具体修复步骤
1. 修复路由代码的异步逻辑问题
你的路由代码混合了async/await和then/catch,且存在潜在的未终止响应的问题,调整后代码如下:
router.route('/signup').post(jsonParser, async (req, res) => { console.log(req.body); const email = req.body.email.toLowerCase(); const password = await bcrypt.hash(req.body.password, 10); const username = req.body.username; // 直接await查询结果,避免先存Query对象再await const oldUser = await User.find({email: email}); if (oldUser.length >= 1){ // 加return确保响应发送后终止函数执行,避免后续代码干扰 return res.status(400).json('User already exists'); } const newUser = new User({email, password, username}); console.log(newUser); try { // 改用await处理save操作,统一异步风格,便于错误排查 await newUser.save(); return res.status(200).json('Sign up successful'); } catch (err) { return res.status(500).json('Error: ' + err); } });
2. 确保测试环境数据库的独立性与清洁
测试环境必须使用独立数据库,且每次测试前清理数据,避免重复用户导致逻辑分支异常:
// 在测试文件中添加钩子 beforeEach(async () => { // 测试前清空用户集合,保证每次测试环境干净 await User.deleteMany({}); }); beforeAll(async () => { // 确保测试前数据库连接成功 await mongoose.connect(process.env.TEST_DB_URI); }); afterAll(async () => { // 测试结束后断开数据库连接 await mongoose.disconnect(); });
3. 临时调整测试超时时间(可选)
如果数据库操作确实耗时较长,可在测试用例中临时增加超时:
test("should respond with a 200 status code", async () => { jest.setTimeout(10000); // 调整为10秒超时 const response = await request(users).post("/signup").send({ "email":"wwww12dSD3", "password":"adasdasdas", "username":"adasdasdasdaYrrrrY" }) expect(response.statusCode).toBe(200) })
4. 排查测试环境数据库连接
检查测试环境的数据库配置:
- 确认
TEST_DB_URI指向的数据库是可正常访问的 - 查看测试运行时的数据库日志,确认
User.find()和newUser.save()是否正常执行 - 若使用内存数据库(如
mongodb-memory-server),确保依赖安装正确且初始化正常
内容的提问来源于stack exchange,提问作者Wilkin 908
相关产品推荐
相关产品推荐

