MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man eine Methode testen, die sich mit Mongo verbindet, ohne sich tatsächlich mit Mongo zu verbinden?

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 mehrere mongod ausgeführt werden Instanzen (1 Konfiguration, 2x2 Daten für Shard+Repl) und ein mongos 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 und node-database-cleaner . Fixtures bieten einen funktionierenden und konsistenten Datensatz zum Testen:Betrachten Sie sie als Bootstrap.

Builds/Tests

  1. Säubern Sie die zugehörige Datenbank mit etwas wie node-database-cleaner .
  2. Fügen Sie Ihre Fixtures mit Hilfe von mongodb-fixtures in die nun leere Datenbank ein .
  3. Führen Sie Ihren Build und Test durch.
  4. 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.