Node.js 摩卡单元测试猫鼬模型
我正在努力找出为我的NodeJS应用程序编写这些单元测试的正确方法(即不是黑客) 在server.js中,我将mongoose连接到运行在localhost:27017上的DB。当我运行mocha测试时,我希望连接到本地主机37017上运行的另一个mongoDB实例,这样我就不会对实时数据库运行测试。当我在test.js中要求mongoose并尝试连接时,mongoose抛出一个错误,说“试图打开未关闭的连接” 我已经尝试在test.js中关闭当前连接,但是由于某些原因它无法工作 我的问题是:在一个文件中连接到测试数据库,但继续让server.js连接到实时数据库的正确方法是什么 我的代码如下:Node.js 摩卡单元测试猫鼬模型,node.js,mongodb,unit-testing,mongoose,mocha.js,Node.js,Mongodb,Unit Testing,Mongoose,Mocha.js,我正在努力找出为我的NodeJS应用程序编写这些单元测试的正确方法(即不是黑客) 在server.js中,我将mongoose连接到运行在localhost:27017上的DB。当我运行mocha测试时,我希望连接到本地主机37017上运行的另一个mongoDB实例,这样我就不会对实时数据库运行测试。当我在test.js中要求mongoose并尝试连接时,mongoose抛出一个错误,说“试图打开未关闭的连接” 我已经尝试在test.js中关闭当前连接,但是由于某些原因它无法工作 我的问题是:在
// test.js
var app = require('../lib/server') // This connects mongoose to a database
var assert = require('assert');
var httpstatus = require('http-status');
var superagent = require('superagent');
// Connect to mongoose
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:37017/testDB'); // THIS THROWS ERROR because server.js is connecting to localhost:27017/liveDB
// Models we will be testing
var thing = require('../models/thing.js');
describe('Thing', function() {
before(function() {
// Clear the database here
}
beforeEach(function() {
// Insert, modify, set up records here
}
it('saves the thing to the database', function() {
// Save and query a thing here (to the test DB)
});
});
你可以试试这个(尽管这是一个黑客):
可能还需要将模型加载到断开连接处理程序中,否则它可能会“附加”到原始连接
同样,这仍然是一个相当棘手的问题,我建议将数据库的配置移动到某种外部配置文件,或者使用环境变量,这可能相对容易实现:
// server.js
mongoose.connect(process.env.MONGO_URL || 'mongodb://localhost:27017/prodDB')
// test.js
process.env.MONGO_URL = 'mongodb://localhost:37017/testDB'
var app = require('../lib/server');
在项目的根目录中创建config目录,并在config文件夹中创建dev.env和test.env文件
在test.env文件中,按如下方式配置测试环境:
PORT=4000
MONGODB_URL=mongodb://127.0.0.1:27017/dbTestName
然后在package.json中,将test.env的设置加载到测试环境中
"test": "env-cmd -f ./config/test.env jest --watchAll --runInBand"
这里我们需要模块,然后在这里加载test.env设置
env cmd包将根据您的环境将.env文件中的所有设置添加到process.env对象中。当您运行运行npm测试时,您的应用程序将使用test.env中的设置
因此,在您的应用程序中,应该使用MONGODB_URL连接mongoose
mongoose
.connect(process.env.MONGODB_URL, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false
})
.catch(err => {
console.log(err.message);
process.exit(1);
})
.then(() => {
console.log("connected to mongodb");
});
您将在dev.env中为您的dev环境使用设置。现在需要调整package.json中的dev脚本
"dev": "env-cmd -f ./config/dev.env node src/index.js",
现在当你跑的时候
npm run dev
您的应用程序从dev.env加载设置通常,这些设置在您的应用程序外部配置,因此在测试期间您将使用不同的配置。但是作为一个快速黑客(抱歉…),您可以在调用测试文件中的连接()
之前尝试查看mongoose.disconnect()
是否有效。即使在连接到DB之前使用mongoose.disconnect()
,它仍然会抛出“尝试打开未关闭的连接”错误。你能谈谈如何像你提到的那样设置一个配置文件吗?我是一个非常新的(不到2周)节点开发人员
"dev": "env-cmd -f ./config/dev.env node src/index.js",
npm run dev