Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 摩卡单元测试猫鼬模型_Node.js_Mongodb_Unit Testing_Mongoose_Mocha.js - Fatal编程技术网

Node.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中关闭当前连接,但是由于某些原因它无法工作 我的问题是:在

我正在努力找出为我的NodeJS应用程序编写这些单元测试的正确方法(即不是黑客)

在server.js中,我将mongoose连接到运行在localhost:27017上的DB。当我运行mocha测试时,我希望连接到本地主机37017上运行的另一个mongoDB实例,这样我就不会对实时数据库运行测试。当我在test.js中要求mongoose并尝试连接时,mongoose抛出一个错误,说“试图打开未关闭的连接”

我已经尝试在test.js中关闭当前连接,但是由于某些原因它无法工作

我的问题是:在一个文件中连接到测试数据库,但继续让server.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