web-dev-qa-db-ja.com

実際にmongoに接続せずに、mongoに接続するメソッドを単体テストする方法は?

Mongoに接続するメソッドをテストするテストを作成しようとしていますが、実際にmongoを実行してテストに成功させるためにそれに接続する必要はありません。

Mongoデーモンが実行されているときに成功する現在のテストを次に示します。

describe('with a valid mongo string parameter', function() {
    it('should return a rejected promise', function(done) {
        var con = mongoFactory.getConnection('mongodb://localhost:27017');
        expect(con).to.be.fulfilled;
        done();
    });
});

mongoFactory.getConnectionコード:

getConnection: function getConnection(connectionString) {

      // do stuff here

        // Initialize connection once
        MongoClient.connect(connectionString, function(err, database) {
          if (err) {
            def.reject(err);
          }

          def.resolve(database);
        });

      return def.promise;
    }
15
Catfish

MongoDBをデータストアとして使用する単体テストコードに関連するSO回答がいくつかあります。

これらのソリューションの統合を試みます。

前文

何よりもまず、テストを実行している間MongoDBを実行する必要があります MongoDBのクエリ言語は複雑であるため、クエリが計画どおりに実行され、アプリケーションが結果に適切に応答していることを確認するには、安定したMongoDBインスタンスに対して正当なクエリを実行する必要があります。ただし、これを念頭に置いて、テストを本番システムに対して決して実行しないでください代わりに、統合環境に対して周辺システムを実行してください。これは、CIソフトウェアと同じマシン上にある場合もあれば、それに比較的単純に近い場合もあります(プロセスに関しては、必ずしもネットワークや地理的には必要ありません)。

このENVはフットプリントが低く、完全にメモリ( resource 1 )( resource 2 )で実行できますが、必ずしも本番環境ENVと同じパフォーマンス特性を必要とするわけではありません。 (パフォーマンステストを行う場合は、これをCIとは別の環境で処理する必要があります。)

セットアップ

  • CI専用のmongodサービスをインストールします。replセットやシャーディングが懸念される場合(例:書き込みに関する懸念、$isolatedの使用なし)など)、複数のmongodインスタンス(1つの構成、shard + replの2x2データ)とmongosインスタンスを同じマシン上で実行して、クラスター環境を模倣することができます。 init.dスクリプト/微調整またはdockerのようなもの。
  • アプリケーション内で環境固有の構成を使用します(.jsonファイルを介して埋め込まれるか、/ etc、/ home/user/.your-などの場所に埋め込みます)アプリなど)。アプリケーションは NODE_ENV=intのようなノード環境変数 に基づいてこれらをロードできます。これらの構成内では、db接続文字列は異なります。環境固有の設定を使用していない場合、アプリケーションのランタイム設定(つまり、「local」、「dev」、「int」、「 pre」、「prod」など)。 リクエストに応じてサンプルを提供できます。
  • アプリケーション/テストスイートにテスト指向のフィクスチャを含めます。リンクされた質問の1つで述べたように、MongoDBのNode.jsドライバーはいくつかのヘルパーライブラリをサポートしています:- mongodb-fixturesおよびnode-database-cleaner 。フィクスチャは、テスト用の実用的で一貫性のあるデータセットを提供します。それらをブートストラップと考えてください。

ビルド/テスト

  1. node-database-cleanerのようなものを使用して、関連するデータベースをクリーンアップします。
  2. mongodb-fixturesを使用して、フィクスチャを空のデータベースに追加します。
  3. ビルドとテストを実行します。
  4. 繰り返す。

一方...

それでもnotMongoDBを実行するのが正しいアプローチであると判断した場合( そして、あなたが唯一のものではない )、データストア呼び出しをORMを備えたドライバーが最善の策です(テストだけでなく、アプリケーション全体に対して)。たとえば、 modelはデータベースに依存しないと主張している のようなものですが、使用したことはありません。このアプローチを利用しても、fixturesおよびenv構成が必要ですが、MongoDBをインストールする必要はありません。ここでの注意点は、選択したORMのなすがままであるということです。

36
zamnuts