mocha在运行测试之前等待数据库连接

时间:2017-08-19 13:08:01

标签: node.js mongodb

基本上要运行测试,我需要与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)
}

1 个答案:

答案 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')
      })
  })

})