基本的にテストを実行するには、MongoDbへのデータベース接続が必要です。データベース・マネージャーには、接続を取得するconnectメソッドと、その接続への参照を取得するgetメソッドがあります。 connectメソッドは起動時に一度だけ呼び出されるはずです。アプリケーションが起動するのは、接続メソッドが呼び出されて接続が返された場合にのみ開始されるため、このデザインはアプリケーションの実行時に正常に機能します。mochaはテストを実行する前にdb接続を待ちます
Mongoのネイティブ(非mongoskin、無マングース)(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')
});
、そこサービスモジュールであるとしリポジトリモジュール。サービスモジュールは、データベースを使用する必要がある場合、リポジトリモジュールを必要とします。私は共通のクエリfindOne、findAllなどを定義するBaseRepositoryモジュールを持っています。すべての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)
}
のラッパーを書いてしまいましたか?あなたは 'before'フックを持っていますか? – alexmac
私は一度だけ呼び出す必要があり、すべてのテストを開始する必要があるので、私はしません。 'before'で' connect'を呼び出しても、 'require(service) - > require(repository) - >コンストラクタが' get'を呼び出すことによって問題が解決されるため、問題は解決しません。 connectが呼び出されていません。 'before'は' require'の後に呼び出されます。 – Sydney
リポジトリコンストラクタから新しい 'init'メソッドにコード(' this.collection = db.get()。collection( 'users'); ')を移動し、このメソッドをテストモジュールの' before'フックで呼び出すことができます。したがって、repoの初期化のために各テストモジュールに 'db.connect'と' before'を呼び出すことで、グローバルな 'before'を1つ持ちます。 – alexmac