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})\nRun 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\');\nRun 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.\nRun 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(){\nRun Code Online (Sandbox Code Playgroud)\n\n经过
\n\n// connect to db\nmongoose.connect(dbURI);\n// remove all documents\nmongoose.connection.on(\'open\', function(){\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n问题是我需要进行多次测试,所以我不能使用mongoose.connect(否则我会收到错误:尝试打开未关闭的连接。)
\n\n那么我如何在测试中使用 createConnection 连接到 mongoose 呢?
\n\n感谢您的帮助 :)
\n为了解决这个问题,我们需要在连接实例上注册模型架构。即使用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)
| 归档时间: |
|
| 查看次数: |
1304 次 |
| 最近记录: |