2017-12-26 13 views
0

mongodbデータベースとのやりとりを行う開発されたソフトウェアのユニット/統合テスト(CI/CD)を行うために、mongodb-prebuiltパッケージを使用しています。mongodbサーバのテストを終了する正しい方法

一般的な使用例は次のとおりです。prebuildパッケージを使用してmongodbサーバーをテストし、テストスイートを実行してからサーバーを終了します。最初と2番目の項目は簡単に実行されますが、3番目の項目はいくつかの問題を引き起こします。

mongodb-prebuilt起動済みサーバーが終了していない場合、テストランナーは永久にハングします。代わりに、testConnection.command({ shutdown: 1 })コマンドでサーバーを終了しようとすると、閉じた接続を参照しているunhandledRejectionが起動します。もちろん、サーバーを停止して強制終了しています。

mongodb-prebuiltafterAllテストセクションに配置するのは正しいですか?テストエンジンはjestですが、それほど重要ではありません。ここ
例コード:

import { MongodHelper } from 'mongodb-prebuilt'; 
import { MongoClient } from 'mongodb'; 

describe('Test suite',() => { 
    let testConnection; 
    beforeAll(async() => { 
     const mongodHelper = new MongodHelper(['--port', "27018"]); 
     await mongodHelper.run(); 
     testConnection = await MongoClient.connect(`mongodb://localhost:27018/admin`); 
    }); 
    afterAll(async() => { 
     await testConnection.dropDatabase(); 
     await testConnection.command({ shutdown: 1 }); 
     await testConnection.close(); 
     testConnection = null; 
    }); 
    /* Here follows some test suite that uses testConnection */ 
} 

問題を解決するためにいくつかの試みがあった:

1)testConnection.command({ shutdown: 1 }) -generated約束を待つ、と瞬時にクライアント接続の閉鎖を開始しないでください - それはいくつかのマシン上で動作しますが、実行速度に依存する可能性が高いため、動作が不安定になります。それはセットアップすることが可能ですprocess.on('unhandledRejection', ...)ハンドラafterAllセクションで、ちょうどミュート例外 - - うまく動作しますが、

だから、イデオロギー的に正しくないと思わので強くは関係ありません。テストの最後に、クライアントの接続終了の

2) 、元のタスクのためのステレオタイプの解決策はありますか?

重要な注意:開発されたソフトウェアはmongodbための特定のアダプタであり、タイミング、管理コマンドなど

含むライブデータベースのすべての側面を尊重しなければならないので、代わりに mongodbを生きるいくつかのモックのパッケージを使用して示唆し、全く適切ではありません元の問題のため

答えて

0

最も便利なソリューションを立ち上げ、それを停止するなど、リアルのMongoDB事前に作成サーバとの自動化された統合テストのためのAPIを提供して名前にもかかわらず、mongo-unit NPMパッケージを、使用している:とhttps://github.com/mikhail-angelov/mongo-unit/

ゲージテストスイートをは、次のようになります。

import 'regenerator-runtime/runtime'; 
import mongoUnit from 'mongo-unit'; 
import { MongoClient } from 'mongodb'; 

describe('MongoDB-based test suite,() => { 
    let testConnection; 

    beforeAll(async() => { 
     const connectionUrl = await mongoUnit.start({ dbName: 'admin' }); 
     testConnection = await MongoClient.connect(connectionUrl); 
    }); 

    afterAll(async() => { 
     await testConnection.dropDatabase(); 
     await testConnection.close(true); 
     await mongoUnit.stop(); 
     testConnection = null; 
    }); 

    /* Test suite goes here */ 

}); 

パッケージも開始時の初期データベースを選択し、テストスイートの最後で停止明確なのMongoDBサーバー・プロセスを実行することができます。

関連する問題