使用 mongoose createConnection 进行摩卡测试超时

Eti*_*hon 5 mocha.js mongoose node.js

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

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

这是Marque对象的代码:

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

因此,当我运行npm test时,我收到此错误:

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

但如果我更换

\n\n
// connect to db\nlet connection = mongoose.createConnection(dbURI);\n// remove all documents\nconnection.on(\'open\', function(){\n
Run Code Online (Sandbox Code Playgroud)\n\n

经过

\n\n
// connect to db\nmongoose.connect(dbURI);\n// remove all documents\nmongoose.connection.on(\'open\', function(){\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切正常并且测试通过:

\n\n
  an instance of Marque\n    \xe2\x9c\x93 has a nom\n    \xe2\x9c\x93 has a _id attribute\n\n\n  2 passing (65ms)\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是我需要进行多次测试,所以我不能使用mongoose.connect(否则我会收到错误:尝试打开未关闭的连接。

\n\n

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

\n\n

感谢您的帮助 :)

\n

pps*_*ith 1

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

如果您包含已注册的模型,则需要始终引用该连接变量,否则,如果您使用 mongoose 加载模型,它永远不会真正与您的数据库通信。

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

...
let connection = mongoose.createConnection(dbURI);
Marque = require('../lib/marque.js')(connection);
...
Run Code Online (Sandbox Code Playgroud)

在 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');
}
Run Code Online (Sandbox Code Playgroud)