基本上要运行测试,我需要与MongoDb的数据库连接才能准备好。数据库管理器有一个连接方法来获取连接,一个get方法来获取对该连接的引用。 connect方法应该在启动时只调用一次。此设计在运行应用程序时工作正常,因为只有在调用connect方法并返回连接时,应用程序才会启动。
数据库管理器使用mongo native(no mongoskin,no mongoose)(database.js):
var config = require('../config')
var MongoClient = require('mongodb').MongoClient
var connection = null
module.exports.connect = function () {
return MongoClient.connect(config.mongodb.uri + config.mongodb.db)
.then(function (db) {
connection = db
})
}
module.exports.get = function () {
if (!connection) {
throw new Error('Call connect first!')
}
return connection
}
启动应用:
var db = require('./services/database');
db.connect()
.then(function() {
logger.info("mongodb is running");
require('./main')
});
在应用程序中,有服务模块和存储库模块。服务模块在必须使用数据库时需要存储库模块。我有一个BaseRepository模块,我在其中定义公共查询findOne,findAll等。对于所有MongoDb集合,我有一个从BaseRepository继承的特定存储库。在构造函数中,我通过调用数据库连接来设置集合。
这意味着当一个服务模块依赖于存储库模块时,必须调用数据库连接方法。这是问题所在,因为我不知道如何在调用connect方法后启动所有测试。 如果您认为这是设计流程,我愿意接受建议。
测试:
var usersService = require('../../services/rest/UsersService');
describe('IT Test', function () {
})
服务:
var usersRepository = require('../dao/UsersRepository');
存储库:
var db = require('../database');
var BaseRepository = require('./BaseRepository');
var util = require('util');
util.inherits(UsersRepository, BaseRepository);
function UsersRepository() {
this.collection = db.get().collection('users'); // <====== The connect method has not been called yet
}
基础资料库:
function BaseRepository() {
this.collection = undefined;
}
BaseRepository.prototype.findOne = function (filters) {
return this.collection.findOne(filters)
}
答案 0 :(得分:0)
我最终为所有测试编写了一个包装器
'use strict'
var logger = require('../services/logger')()
var db = require('../services/database')
describe('All tests wrapper', function () {
it('should pass', function () {
return db.connect()
.then(function () {
logger.info('MongoDB is running')
require('./agenda/AgendaJobsIT')
require('./dashboard/DashboardsServiceIT')
require('./twitter/TwitterServiceTest')
require('./authentication/TokenServiceTest')
})
})
})