为Mongoose运行多个Mochatesting文件已损坏

根据Alexey B.的评论,我修改了我的testing代码,发现导致我的testing代码出现同样错误的情况。 当我尝试testing单个testing文件时,它运行良好。 但是,如果我尝试同时testing多个testing文件,则会被破坏。 常见错误消息是Error: Trying to open unclosed connection. 。 看来我的数据库连接代码有一些问题。

这是我修改的代码。

utils.js

 var mongoose = require('mongoose'); module.exports = function(models) { return function(done) { for(var i in models) { models[i].remove({}, function() {}); } done(); }; }; 

user.server.model.tests.js

 var should = require('should'), mongoose = require('mongoose'), utils = require('./utils'); require('../config/mongoose')(); var User = mongoose.model('User'), user; describe('User Model Tests:', function() { afterEach(utils([User])); describe('#create()', function() { beforeEach(function(done) { user = new User({ email:'test1@test.com', username: 'test1', password: '1234' }); done(); }); it('create a new user', function(done) { user.save(function(err, user) { should.not.exist(err); user.email.should.equal('test1@test.com'); user.username.should.equal('test1'); done(); }); }); it('create a new user with an existing email', function(done) { user.save(function(err) { should.not.exist(err); }); var userDUP = new User({ email:'test1@test.com', username:'test2', password: '1234' }); userDUP.save(function(err) { should.exist(err); done(); }); }); }); }); 

product.server.model.tests.js

 var should = require('should'), mongoose = require('mongoose'), utils = require('./utils'); require('../config/mongoose')(); var Product = mongoose.model('Product'), User = mongoose.model('User'); describe('Product Model Tests:', function(){ afterEach(utils([User, Product])); describe('#create()', function(){ it('create a new product', function(done) { var user = new User({ email:'test@test.com', username: 'test', password: '1234' }); user.save(function(err) { should.not.exist(err); }); var product = new Product({ name: 'Product1', user: user }); product.save(function(err, product) { should.not.exist(err); User.findOne({'_id':product.user}, function(err, user) { should.not.exist(err); user.username.should.equal('test'); }); product.name.should.equal('Product1'); product.ordered.should.equal(0); product.stock.should.equal(0); done(); }); }); it('create a new product without a user', function(done) { var product = new Product({ name: 'Product' }); product.save(function(err){ should.exist(err); done(); }); }); }); }); 

我有两个更多的testing文件,但是它们的结构是一样的。

另外,我的连接数据库是在../config/mongoose.js定义的。 这是代码。

 var config = require('./config'), mongoose = require('mongoose'); module.exports = function() { var db = mongoose.connect(config.db); console.log('MongoDB is successfully connected.'); require('../models/user.server.model'); require('../models/product.server.model'); require('../models/sale.server.model'); require('../models/dcompany.server.model'); require('../models/customer.server.model'); return db; }; 

我试图使用createConnect连接数据库,而不是connect ,但它引发了另一个称为timeout错误。

以下是这个问题的旧版本。

我有两个testing文件(' product.server.model.tests.js '和' user.server.model.tests.js '),并且都调用包含beforeEachafterEach ' utils.js ',其中连接/断开数据库已经完成了。

当我对Mochatesting进行运行/debuggingconfiguration并尝试在Webstorm 11上进行testing时,testing被打破,出现错误( Error: Trying to open unclosed connection. ),如下所示。 当Mocha尝试testinguser.server.model.js时,会发生这种情况。

在这里输入图像描述

但是,当我在terminal上运行这些testing时,它会通过所有的testing! (见下文)另外,如果我为每个testing文件分别运行/debuggingconfiguration,则没有问题。

在这里输入图像描述

Webstorm 11上的我的运行/debuggingconfiguration如下所示。

在这里输入图像描述

这是Webstorm 11有点bug吗? 或者在设置运行/debuggingconfiguration或我的testing代码时出现错误? 我附上了我的testing代码。


utils.js

 var mongoose = require('mongoose'); beforeEach(function(done) { require('../config/mongoose')(); for(var i in mongoose.connection.collections) { mongoose.connection.collections[i].remove(function() {}); } done(); }); afterEach(function(done) { mongoose.disconnect(); done(); }); 

user.server.model.test.js

 require('./utils'); var should = require('should'), mongoose = require('mongoose'); describe('User Model Tests:', function() { describe('#create()', function() { it('create a new user', function(done) { var User = mongoose.model('User'); var user = new User({ email:'test1@test.com', username: 'test1', password: '1234' }); user.save(function(err, user) { should.not.exist(err); user.email.should.equal('test1@test.com'); user.username.should.equal('test1'); done(); }); }); it('duplication: email', function(done) { var User = mongoose.model('User'); var user = new User({ email:'test1@test.com', username: 'test1', password: '1234' }); user.save(function(err) { should.not.exist(err); }); var userDUP = new User({ email:'test1@test.com', username:'test2', password: '1234' }); userDUP.save(function(err) { should.exist(err); done(); }); }); }); }); 

product.server.model.tests.js

 require('./utils'); var should = require('should'), mongoose = require('mongoose'); describe('Product Model Tests:', function(){ describe('#create()', function(){ it('create a new product', function(done) { var Product = mongoose.model('Product'); var User = mongoose.model('User'); var user = new User({ email:'test@test.com', username: 'test', password: '1234' }); user.save(function(err) { should.not.exist(err); }); var product = new Product({ name: 'Product1', user: user }); product.save(function(err, product) { should.not.exist(err); User.findOne({'_id':product.user}, function(err, user) { should.not.exist(err); user.username.should.equal('test'); }); product.name.should.equal('Product1'); product.ordered.should.equal(0); product.stock.should.equal(0); done(); }); }); it('create a new product without a user', function(done) { var Product = mongoose.model('Product'); var product = new Product({ name: 'Product' }); product.save(function(err){ should.exist(err); done(); }); }); }); }); 

我发现捕捉错误为我解决了这个问题。 这可能是一个摩卡错误? 反正这个工作,这是不值得我的时间进一步调查。 我希望这可以疏通别人。

注意我是如何将一个callback函数传递给connect函数的:

 var mongoose = require('mongoose'); ... before(function (done) { mongoose.connect('mongodb://localhost/test', function(err) { done(); }); }); after(function (done) { mongoose.connection.close(); done(); }); describe('some tests', function() { it('can do something', function (done) { }); }) 

不能确切地说,这是在这里的问题,但是在单独的文件中实施摩卡挂钩是一个不好的做法。 例如,然后你添加更多的testing到你的项目,你不能禁用那些不需要数据库连接的testing钩子。

正确的方法是制作一些辅助模块

 module.exports = { connect: function (done) { require('../config/mongoose')(); for(var i in mongoose.connection.collections) { mongoose.connection.collections[i].remove(function() {}); } done(); }, disconnect: function (done) { mongoose.disconnect(); done(); } }; 

并在testing中应用

 var should = require('should'), mongoose = require('mongoose'), helper = require('./utils'); describe('User Model Tests:', function() { beforeEach(helper.connect); afterEach(helper.disconnect); describe('#create()', function() { ... }); }); 

我重构了我的testing代码,提到“ 用mocha.js连接多个文件的testing ”。 我build立了一个test.js来join所有不同的testing文件,并且在test.js的开头,连接到数据库已经尝试过了。 这是我的工作testing代码。

test/test.js

 var mongoose = require('mongoose'); var importTest = function(name, path) { describe(name, function() { require(path); }); }; //Connecting to the DB require('../../app/config/mongoose')(); describe("Model Testing:", function() { before(function() { console.log('Start a model testing!\n'); }); importTest('User Model Testing:', './models/user.server.model.tests'); importTest('Sale Model Testing:', './models/sale.server.model.tests'); importTest('Product Model Testing:', './models/product.server.model.tests'); importTest('DCompany Model Testing:', './models/dcompany.server.model.tests'); after(function() { mongoose.disconnect(); console.log("Disconnect to the DB.\n"); }) }); 

/test/models/user.server.model.tests.js

 var should = require('should'), mongoose = require('mongoose'), utils = require('./utils'); var User = mongoose.model('User'), user; afterEach(utils([User])); describe('#create()', function() { beforeEach(function(done) { user = new User({ email:'test1@test.com', username: 'test1', password: '1234' }); done(); }); it('create a new user', function(done) { user.save(function(err, user) { should.not.exist(err); user.email.should.equal('test1@test.com'); user.username.should.equal('test1'); done(); }); }); it('create a new user with an existing email', function(done) { user.save(function(err) { should.not.exist(err); }); var userDUP = new User({ email:'test1@test.com', username:'test2', password: '1234' }); userDUP.save(function(err) { should.exist(err); done(); }); }); }); 

其他testing文件的结构与user.server.model.tests.js类似。