Es gibt ein paar SO-Antworten in Bezug auf Komponententestcode, der MongoDB als Datenspeicher verwendet:
- Mocking-Datenbank in node.js?
- Mock/Test Mongodb Database Node.js
- Eingebettete MongoDB beim Ausführen von Integrationstests
- Ähnlich:Unit-Testing-Klassen mit Online-Funktionalität
Ich werde versuchen, diese Lösungen zu konsolidieren.
Präambel
In erster Linie sollten Sie sollten möchten, dass MongoDB ausgeführt wird, während Sie Ihre Tests durchführen. Die Abfragesprache von MongoDB ist komplex, daher ist das Ausführen legitimer Abfragen für eine stabile MongoDB-Instanz erforderlich, um sicherzustellen, dass Ihre Abfragen wie geplant ausgeführt werden und Ihre Anwendung ordnungsgemäß auf die Ergebnisse reagiert. Dies sollten Sie jedoch niemals tun Führen Sie Ihre Tests gegen ein Produktionssystem durch, sondern gegen ein Peripheriesystem Ihrer Integrationsumgebung. Dies kann sich auf demselben Computer wie Ihre CI-Software befinden oder einfach relativ nahe daran (in Bezug auf den Prozess, nicht unbedingt Netzwerk oder geografisch).
Diese ENV könnte Low-Footprint sein und vollständig im Arbeitsspeicher ausgeführt werden (Ressource 1) (Ressource 2), würde aber nicht unbedingt die gleichen Leistungsmerkmale wie Ihre Produktions-ENV erfordern. (Wenn Sie einen Leistungstest durchführen möchten, sollte dies ohnehin in einer von Ihrem CI getrennten Umgebung erfolgen.)
Einrichtung
- Installieren Sie einen
mongod
Service speziell für CI. Wenn Repl-Sets und/oder Sharding von Bedeutung sind (z. B. Schreibprobleme, keine Verwendung von$isolated
, usw.), ist es möglich, eine Cluster-Umgebung nachzuahmen, indem mehreremongod
ausgeführt werden Instanzen (1 Konfiguration, 2x2 Daten für Shard+Repl) und einmongos
Instanz auf dem gleichen Rechner entweder mit einigen init.d-Skripten/Tweaks oder so etwas wie Docker. - Umgebungsspezifische Konfigurationen verwenden innerhalb Ihrer Anwendung (entweder eingebettet über .json-Dateien oder an einem Ort wie /etc, /home/user/.your-app oder ähnlichem). Ihre Anwendung kann diese basierend auf einer Knotenumgebungsvariablen wie
NODE_ENV=int
laden . Innerhalb dieser Konfigurationen unterscheiden sich Ihre db-Verbindungszeichenfolgen. Wenn Sie nicht sind Wenn Sie env-spezifische Konfigurationen verwenden, beginnen Sie damit, die Laufzeiteinstellungen der Anwendung zu abstrahieren (z. B. "local", "dev", "int", "pre", "prod" usw.). Auf Anfrage kann ich ein Muster zur Verfügung stellen. - Integrieren Sie testorientierte Fixtures in Ihre Anwendung/Testsuite. Wie in einer der verknüpften Fragen erwähnt, unterstützt der Node.js-Treiber von MongoDB einige Hilfsbibliotheken:
mongodb-fixtures
undnode-database-cleaner
. Fixtures bieten einen funktionierenden und konsistenten Datensatz zum Testen:Betrachten Sie sie als Bootstrap.
Builds/Tests
- Säubern Sie die zugehörige Datenbank mit etwas wie
node-database-cleaner
. - Fügen Sie Ihre Fixtures mit Hilfe von
mongodb-fixtures
in die nun leere Datenbank ein . - Führen Sie Ihren Build und Test durch.
- Wiederholen.
Andererseits...
Wenn Sie sich trotzdem dafür entscheiden nicht Das Ausführen von MongoDB ist der richtige Ansatz (und Sie wären nicht der einzige), dann ist das Abstrahieren Ihrer Datenspeicheraufrufe vom Treiber mit einem ORM die beste Wahl (für die gesamte Anwendung, nicht nur zum Testen). Zum Beispiel so etwas wie model
behauptet, datenbankunabhängig zu sein, obwohl ich es nie benutzt habe. Bei diesem Ansatz würden Sie immer noch Vorrichtungen benötigen und env-Konfigurationen , Sie müssen MongoDB jedoch nicht installieren. Der Vorbehalt hierbei ist, dass Sie dem von Ihnen gewählten ORM ausgeliefert sind.