嘲笑用于MEAN应用程序unit testing的MongoDB连接

我一直在绞尽脑汁,试图找出一种方法来处理我的unit testingMongoDB连接。 我想知道什么适当的方法是做这个,因为我的应用程序布局可能是问题。 这是一个更大的项目,有很多模块。

总体布局

package.json server.js -models -index.js -users.js -events.js -... -services -index.js -userActivity.js -... +public +routes +util +test 

车型/ users.js

 "use strict"; modules.export = function(mongoose) { var Schema = mongoose.Schema; var userSchema = new Schema({ name: String }); var userModel = mongoose.model('User', userSchema); var userDAO {}; userDAO.addUser(user) { var newUser = new userModel(user); return newUser.save(); } userDAO.getUser(id) { return userModel.findById(id).lean().exec(); } return userDAO; }; 

车型/ index.js

 "use strict"; var bluebird= require('bluebird'); var mongoose = bluebird.promisifyAll(require('mongoose')); var Users = require ('./users'); var Events = require('./events'); module.exports.Users = new Users(mongoose); module.exports.Events = new Events(mongoose); 

服务/ userActivity.js

 "use strict"; var db = require('../models'); module.exports = function(userID) { return db.Events.getEventsForUser(userId) }; 

现在问题在哪里

testing/ test.js

 "use strict"; var chai = require('chai'); chai.use(require('chai-as-promised'); var expect = chai.expect; var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost/testDB") var db = require('../models'); var services = require('../services') describe("sample tests", function() { var user1, user2; var user1TestEvents = []; before(function(done) { db.Users.addUser({name:"John"}). then(function(john) { user1 = john; return db.Users.addUser({name: "Mary"}); }). then(function(mary) { user2 = mary; return db.Events.addEvent{user: user1._id, event: "logged in", time: new Date()}); }). then(function(event) { user1TestEvents.push(event); done() }); }; it('gets a users events', function() { var events = services.getEventsForUser(user1._id); return expect(events).eventually.to.have.length(user1TestEvents.length); }); 

如果我连接到我自己的机器上的活动数据库,但testing工作得很好,但我们的CI服务器将不会有一个mongo数据库上运行。 我一直在试图找出伪造连接的一些方法,但我还没有find任何好的select

我一直在尝试使用Mockgoose来模拟数据库,但除非将所有组件都一律通过mockgooe的mongoose对象,否则它将无法工作。

 var mockgoose = require('mockgoose'); var mongoose = require('mongoose'); mockgoose(mongoose); mongoose.connect("mongodb://localhost/test"); 

当我尝试这个,在第一个承诺在我的“之前”解决之后,所有后续的承诺永远不会解决,摩卡超时。

我还没有能够得到tingoDB工作,我觉得我失去了明显的东西。

我见过的所有示例都是非常简单的testing用例,其中的模型创build在与mongoose对象执行连接相同的位置,并且使应用程序分离,我似乎无法与mongoose解耦到实际的MongoDB实例。

如果任何人有unit testing没有一个实际的MongoDB实例的MEAN应用程序的经验,我会很高兴有关如何解决我的布局和让我的unit testing工作的一些build议。

你可以使用rewire来模拟你需要的任何模块。 并重新定义你需要的方法。