【问题标题】:Timeout using mongoose createConnection for test with mocha使用 mongoose createConnection 进行 mocha 测试超时
【发布时间】:2016-01-08 06:03:40
【问题描述】:

我的 mongoose.createConnection 函数有问题,这是我的测试代码:

"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');

所以当我运行 npm test 时,我得到了这个错误:

  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(){

一切正常,测试通过:

  an instance of Marque
    ✓ has a nom
    ✓ has a _id attribute


  2 passing (65ms)

问题是我需要进行多次测试,所以我不能使用 mongoose.connect(否则我得到 Error: Trying to open unclosed connection.

那么我如何在我的测试中使用 createConnection 连接到 mongoose 呢?

感谢您的帮助:)

【问题讨论】:

    标签: node.js mongoose mocha.js


    【解决方案1】:

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

    如果您包含已注册的模型,则需要始终引用该连接变量,否则,如果您使用 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');
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2023-04-09
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 2015-10-02
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多