You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:10:27