Er zijn een paar SO-antwoorden met betrekking tot code voor het testen van eenheden die MongoDB als gegevensopslag gebruikt:
- Spottende database in node.js?
- Mock/Test Mongodb Database Node.js
- Ingesloten MongoDB bij het uitvoeren van integratietests
- Vergelijkbaar:klassen voor het testen van eenheden met online functionaliteit
Ik zal een poging doen om deze oplossingen te consolideren.
Inleiding
Eerst en vooral moet je moeten wilt dat MongoDB actief is tijdens het uitvoeren van uw tests. De querytaal van MongoDB is complex, dus het uitvoeren van legitieme query's op een stabiele MongoDB-instantie is vereist om ervoor te zorgen dat uw query's worden uitgevoerd zoals gepland en dat uw toepassing correct reageert op de resultaten. Met dit in gedachten moet u echter nooit voer uw tests uit op een productiesysteem, maar in plaats daarvan op een randsysteem voor uw integratieomgeving. Dit kan op dezelfde machine zijn als uw CI-software, of gewoon relatief dichtbij (in termen van proces, niet noodzakelijk netwerk of geografisch gezien).
Deze ENV kan een kleine footprint hebben en volledig in het geheugen draaien (bron 1) (bron 2), maar vereist niet noodzakelijk dezelfde prestatiekenmerken als uw productie-ENV. (Als u prestatietests wilt uitvoeren, moet dit hoe dan ook in een aparte omgeving van uw CI worden gedaan.)
Instellen
- Installeer een
mongod
service specifiek voor CI. Als repl-sets en/of sharding een probleem vormen (bijv. schrijfprobleem, geen gebruik van$isolated
, etc.), is het mogelijk om een geclusterde omgeving na te bootsen door meerderemongod
instances (1 config, 2x2 data for shard+repl) en eenmongos
instantie op dezelfde machine met ofwel enkele init.d scripts/tweaks of iets als docker. - Gebruik omgevingsspecifieke configuraties binnen uw toepassing (ofwel ingebed via .json-bestanden, of ergens zoals /etc, /home/user/.your-app of iets dergelijks). Uw toepassing kan deze laden op basis van een knooppuntomgevingsvariabele zoals
NODE_ENV=int
. Binnen deze configuraties zullen uw db-verbindingsreeksen verschillen. Als je niet bent gebruik env-specifieke configuraties, begin dit te doen als een middel om de runtime-instellingen van de applicatie te abstraheren (d.w.z. "local", "dev", "int", "pre", "prod", enz.). Ik kan op verzoek een voorbeeld leveren. - Voeg testgerichte armaturen toe aan uw applicatie/testsuite. Zoals vermeld in een van de gekoppelde vragen, ondersteunt het Node.js-stuurprogramma van MongoDB enkele helperbibliotheken:
mongodb-fixtures
ennode-database-cleaner
. Fixtures bieden een werkende en consistente dataset voor testen:beschouw ze als een bootstrap.
Builds/Tests
- Reinig de bijbehorende database met iets als
node-database-cleaner
. - Vul uw armaturen in de nu lege database met behulp van
mongodb-fixtures
. - Voer je build en test uit.
- Herhalen.
Aan de andere kant...
Als je nog steeds besluit dat niet het uitvoeren van MongoDB is de juiste aanpak (en je zou niet de enige zijn), dan is het abstraheren van je datastore-oproepen van het stuurprogramma met een ORM de beste keuze (voor de hele applicatie, niet alleen voor testen). Bijvoorbeeld iets als model
beweert database-agnostisch te zijn, hoewel ik het nooit heb gebruikt. Als u deze aanpak gebruikt, heeft u nog steeds armaturen nodig en env-configuraties , maar u hoeft MongoDB niet te installeren. Het voorbehoud hierbij is dat je overgeleverd bent aan de ORM die je kiest.