使用Mocha做后端测试执行node命令时出现before未定义错误如何修复?
报错根因
ReferenceError: before is not defined的核心原因是你用原生node命令执行了Mocha测试文件:before、after、it、describe这些都是Mocha框架注入的全局变量,只有在Mocha运行环境下才会存在,原生Node.js环境没有这些变量,所以直接触发引用报错。
完整修复步骤
1. 修正测试执行方式
首先确认你已经安装Mocha:
- 项目局部安装执行:
npm install mocha --save-dev - 全局安装执行:
npm install mocha -g
执行测试时不要用node命令,改用Mocha专属命令:
- 局部安装的用户执行:
npx mocha helper_test.js - 全局安装的用户可直接执行:
mocha helper_test.js - 你也可以在项目
package.json的scripts字段中添加配置:
之后直接执行"scripts": { "test": "mocha helper_test.js" }npm test即可运行测试。
2. 修复代码逻辑错误
你当前的测试代码还有两处会导致运行失败的问题,需要同步修改:
- 普通JS对象无法调用Mongoose的
.save()方法:你定义的user1是普通对象,不是Mongoose Model实例,需要先引入你项目中定义的User模型,再创建实例:// 替换为你项目中User模型的实际文件路径 const User = require('./models/user'); .save()是异步操作,你当前的写法会在数据插入完成前就执行done()进入测试逻辑,需要改为等待异步操作完成再调用done()。
修正后的完整代码示例
const mongoose = require('mongoose'); // 引入User模型 const User = require('./models/user'); mongoose.Promise = global.Promise; before(done => { mongoose.connect('mongodb://localhost:27017/test_app', { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false }); mongoose.connection // 改为async异步回调 .once('open', async () => { const user1 = new User({ _id: '6181608b936f234576a24d4d', role: 'FREEUSER_ROLE', status: true, active: false, lang: "ESP", username: "BaldanHero", email: "baldanhero@gmail.com", password: "12345678", }) // 等待数据插入完成 await user1.save(); done(); }) .on('error', error => { console.log('Error', error); }); }); after(async () => { try { await mongoose.connection.dropDatabase(); } catch (error) { console.log(error); } mongoose.connection.close(); });
内容的提问来源于stack exchange,提问作者Mr. Baldan
相关产品推荐
相关产品推荐

