为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
'),并且都调用包含beforeEach
和afterEach
' 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
类似。
- 用Mochatestingjavascript – 我如何使用console.log来debuggingtesting?
- 如何debugging与Mocha运行的Eclipse中的Javascriptunit testing?
- 摩卡/ Should.js使用asynchronousfunction
- 代码覆盖率在unit testing
- 如何用mocha / chai模拟窗口/文档
- 嘲笑的对象看起来像mongoose的对象
- 使用SailsJS / Node,Mocha,Supertest进行authentication的会话存储
- 摩卡testing在失败时执行两次callback
- 在Mocha中依次运行两个不同的testing文件