Wir verwenden mongodb-prebuilt
Paket für die Durchführung von Unit/Integration Tests (CI/CD) für die entwickelte Software, die Interaktion mit mongodb Datenbank führt.Richtiger Weg zum Testen Test mongodb Server
Häufiger Anwendungsfall ist folgendes: Starten Sie den Test des mongodb-Servers mit dem Prebuild-Paket, führen Sie die Testsuite aus und beenden Sie den Server. Erste und zweite Punkte sind leicht erledigt, aber der dritte verursacht einige Probleme.
Wenn der mongodb-prebuilt
-gestartete Server nicht beendet wurde, bleibt der Test Runner für immer hängen. Wenn Sie stattdessen versuchen, den Server mit dem Befehl testConnection.command({ shutdown: 1 })
zu beenden, wird unhandledRejection
ausgelöst, was sich auf eine geschlossene Verbindung bezieht - die natürlich durch das Stoppen des Servers zwangsweise geschlossen wurde.
Welches ist der richtige Weg zu entsorgen mongodb-prebuilt
bei afterAll
Testabschnitt? Test Engine ist jest
, aber es ist nicht wichtig.
Beispielcode hier:
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 */
}
Es gab einige Versuche Problem zu lösen:
1) Sie erwarten nicht testConnection.command({ shutdown: 1 })
-Generated Versprechen, und sofort Client-Verbindung Schließen initiieren - es auf einigen Computern funktioniert, aber hängt höchstwahrscheinlich von der Ausführungsgeschwindigkeit ab und funktioniert daher instabil.
2) Aufgrund der Client-Verbindungsabbruch am Ende der Tests stark spielt keine Rolle - es ist möglich, die Einrichtung process.on('unhandledRejection', ...)
Handler in afterAll
Abschnitt und nur stumm Ausnahme - funktioniert gut, aber ideologisch falsche
zu sein scheint also Gibt es vielleicht eine stereotypische Lösung für die ursprüngliche Aufgabe?
WICHTIGER HINWEIS: einige Mock-Pakete stattdessen leben mongodb
verwenden was darauf hindeutet, ist überhaupt nicht geeignet, da entwickelte Software spezifischen Adapter für mongodb
und sollte alle Aspekte der Live-Datenbank, einschließlich Timings, admin Befehle respektieren und so