超时使用mongoose createConnection与摩卡testing

我有一个mongoose.createConnection函数的问题,这里是我的testing代码:

"use strict"; // connect to mongodb://localhost/node_marque_test // empty database before each test let mongoose = require('mongoose'), expect = require('chai').expect, // use a specific base for test purposes dbURI = 'mongodb://localhost/node_marque_test', Marque = require('../lib/marque.js'); before(function(done){ // connect to db let connection = mongoose.createConnection(dbURI); // remove all documents connection.on('open', function(){ Marque.remove(function(err, marques){ if(err){ console.log(err); throw(err); } else { // console.log('cleaning marques from mongo'); done(); } }) }) }) afterEach(function(done){ Marque.remove().exec(done); }) describe('an instance of Marque', ()=>{ let marque; beforeEach((done)=>{ marque = new Marque({name: 'YAMAHA'}) marque.save((err)=>{ if(err){throw(err);} done(); }) }) it('has a nom', ()=>{ expect(marque.name).to.eql('YAMAHA'); }) it('has a _id attribute', ()=>{ expect(marque).to.have.property('_id') }) }) 

这是Marque对象的代码:

 "use strict"; let mongoose = require('mongoose'), Schema = mongoose.Schema; // Schema definition with some validation let marqueSchema = Schema({ name: { type: String, required: true} }); // compile schema to create a model let Marque = mongoose.model('Marque', marqueSchema); // custom validation rules Marque.schema.path('name').validate(name_is_unique, "This name is already taken"); function name_is_unique(name,callback) { Marque.find({$and: [{name: name},{_id: {$ne: this._id}}]}, function(err, names){ callback(err || names.length === 0); }); } module.exports = mongoose.model('Marque'); 

所以当我运行npmtesting时,我得到这个错误:

  1) "before all" hook 0 passing (2s) 1 failing 1) "before all" hook: Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

但是,如果我更换

 // connect to db let connection = mongoose.createConnection(dbURI); // remove all documents connection.on('open', function(){ 

通过

 // connect to db mongoose.connect(dbURI); // remove all documents mongoose.connection.on('open', function(){ 

一切正常,testing通过:

  an instance of Marque ✓ has a nom ✓ has a _id attribute 2 passing (65ms) 

问题是,我需要做多重testing,所以我不能使用mongoose.connect (否则我得到错误:试图打开未closures的连接。

那么我如何使用createConnection连接到我的testing中的mongoose?

谢谢你的帮助 :)

为了解决这个问题,我们需要在连接实例上注册模型模式。 即使用connection.model而不是mongoose.model。 从这里

如果包含已注册的模型,则需要始终引用该连接variables,否则,如果使用mongoose来加载模型,则实际上将永远不会与您的数据库进行通信。

要解决您的问题,首先将连接实例传递给marque.js。

 ... let connection = mongoose.createConnection(dbURI); Marque = require('../lib/marque.js')(connection); ... 

和在marque.js中:

 "use strict"; let mongoose = require('mongoose'), Schema = mongoose.Schema; // Schema definition with some validation let marqueSchema = Schema({ name: { type: String, required: true} }); module.exports = function(conn) { // compile schema to create a model. Probably should use a try-catch. let Marque = conn.model('Marque', marqueSchema); // custom model validation code here // ... return conn.model('Marque'); }