mongodbデータベースとのやりとりを行う開発されたソフトウェアのユニット/統合テスト(CI/CD)を行うために、mongodb-prebuilt
パッケージを使用しています。mongodbサーバのテストを終了する正しい方法
一般的な使用例は次のとおりです。prebuildパッケージを使用してmongodbサーバーをテストし、テストスイートを実行してからサーバーを終了します。最初と2番目の項目は簡単に実行されますが、3番目の項目はいくつかの問題を引き起こします。
mongodb-prebuilt
起動済みサーバーが終了していない場合、テストランナーは永久にハングします。代わりに、testConnection.command({ shutdown: 1 })
コマンドでサーバーを終了しようとすると、閉じた接続を参照しているunhandledRejection
が起動します。もちろん、サーバーを停止して強制終了しています。
mongodb-prebuilt
をafterAll
テストセクションに配置するのは正しいですか?テストエンジンは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
を生きるいくつかのモックのパッケージを使用して示唆し、全く適切ではありません元の問題のため