Mocha运行测试时无法建立MongoDB Atlas数据库连接问题求助
问题根因
- 运行Mocha测试时直接执行测试文件,没有引入server.js,所以server中调用的
connectDB()逻辑完全没有触发,自然不会有数据库连接行为 connectDB是异步函数,原代码中没有等待连接完成就执行数据库操作,也会导致超时- 测试文件默认没有加载dotenv配置,会导致数据库连接串的环境变量缺失,即使添加连接逻辑也可能失败
修复步骤
1. 修正connection.js的异步逻辑
给mongoose.connect添加await,确保调用connectDB时可以等待连接完成:
const mongoose = require('mongoose'); const URI = `mongodb+srv://${process.env.DB_USERNAME}:${process.env.DB_PASSWORD}@betacluster.7jf4v.mongodb.net/servicenowclone?retryWrites=true&w=majority` const connectDB = async () => { try { // 新增await等待连接完成 await mongoose.connect(URI, { useUnifiedTopology: true, useNewUrlParser: true }); mongoose.connection.once('open',function() { console.log('connection established'); }).on('error',() => console.log('gi atay way connection sa database man')) } catch (err) { console.log(err) } } module.exports = connectDB;
2. 修正测试文件,添加连接钩子和环境变量加载
在测试执行前后添加数据库连接、断开的钩子,同时修正async和done混用的问题:
require('dotenv').config() // 加载环境变量 const mocha = require('mocha'); const assert = require('assert'); const mongoose = require('mongoose'); const connectDB = require('../DB/connection') // 引入数据库连接方法 const ticketInstance = require('../models/ticket') //describe tests describe('saving a ticket', function () { // 所有测试执行前先连接数据库 before(async function() { // 延长超时时间,避免MongoDB Atlas公网连接慢导致超时 this.timeout(10000); await connectDB(); }) // 所有测试执行后断开数据库连接 after(async function() { await mongoose.connection.close(); }) it('create ticket', async function () { // 直接用async/await语法,无需混用done回调 const newTicket = new ticketInstance({ number: 1, type: 'Request', customer: 'Carlo Principe', description: 'first ticket created from a test', subject:'test subject' }) await newTicket.save(); assert(newTicket.isNew === false); }); })
额外注意事项
- 运行测试前确认
.env文件在项目根目录,包含正确的DB_USERNAME和DB_PASSWORD配置 - 如果测试还是超时,可以适当调整before钩子的timeout时长,MongoDB Atlas的公网连接偶尔会有延迟
内容的提问来源于stack exchange,提问作者CarlP
相关产品推荐
相关产品推荐

