sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan enhedsteste man en metode, der forbinder til mongo, uden egentlig at forbinde til mongo?

Der er et par SO-svar relateret til enhedstestkode, der bruger MongoDB som datalager:

  • Hånende database i node.js?
  • Mock/Test Mongodb Database Node.js
  • Indbygget MongoDB ved kørsel af integrationstest
  • Lignende:Enhedstestklasser, der har onlinefunktionalitet

Jeg vil gøre et forsøg på at konsolidere disse løsninger.

Indledning

Først og fremmest bør du ønsker, at MongoDB skal køre, mens du udfører dine tests. MongoDB's forespørgselssprog er komplekst, så det er nødvendigt at køre legitime forespørgsler mod en stabil MongoDB-instans for at sikre, at dine forespørgsler kører som planlagt, og at din applikation reagerer korrekt på resultaterne. Med dette i tankerne bør du dog aldrig køre dine tests mod et produktionssystem, men i stedet et perifert system til dit integrationsmiljø. Dette kan være på den samme maskine som din CI-software, eller ganske enkelt relativt tæt på den (med hensyn til proces, ikke nødvendigvis netværk eller geografisk set).

Denne ENV kunne være lav-fodaftryk og køre fuldstændig i hukommelsen (ressource 1) (ressource 2), men ville ikke nødvendigvis kræve de samme ydeevneegenskaber som din produktions-ENV. (Hvis du ønsker at teste ydeevnen, skal dette alligevel håndteres i et separat miljø fra dit CI.)

Opsætning

  • Installer en mongod service specifikt til CI. Hvis repl-sæt og/eller sharding giver anledning til bekymring (f.eks. skrive bekymring, ingen brug af $isolated osv.), er det muligt at efterligne et klynget miljø ved at køre flere mongod instanser (1 config, 2x2 data for shard+repl) og en mongos instans på den samme maskine med enten nogle init.d scripts/tweaks eller noget som docker.
  • Brug miljøspecifikke konfigurationer i dit program (enten indlejret via .json-filer eller et eller andet sted som /etc, /home/user/.your-app eller lignende). Din applikation kan indlæse disse baseret på en nodemiljøvariabel som NODE_ENV=int . Inden for disse konfigurationer vil dine db-forbindelsesstrenge være forskellige. Hvis du ikke er det Brug env-specifikke konfigurationer, begynd at gøre dette som et middel til at abstrahere applikationens runtime-indstillinger (dvs. "lokal", "dev", "int", "pre", "prod" osv.). Jeg kan levere en prøve efter anmodning.
  • Inkluder testorienterede armaturer med din applikation/testpakke. Som nævnt i et af de linkede spørgsmål, understøtter MongoDBs Node.js-driver nogle hjælpebiblioteker:mongodb-fixtures og node-database-cleaner . Inventar giver et fungerende og ensartet datasæt til test:tænk på dem som en bootstrap.

Bygger/test

  1. Rens den tilknyttede database ved at bruge noget som node-database-cleaner .
  2. Fyld dine armaturer ind i den nu tomme database ved hjælp af mongodb-fixtures .
  3. Udfør din build og test.
  4. Gentag.

På den anden side...

Hvis du stadig beslutter dig for at ikke at køre MongoDB er den korrekte tilgang (og du ville ikke være den eneste), så at abstrahere dine datalageropkald fra driveren med en ORM er dit bedste bud (for hele applikationen, ikke kun test). For eksempel noget som model hævder at være databaseagnostisk, selvom jeg aldrig har brugt det. Ved at bruge denne tilgang vil du stadig kræve armaturer og env-konfigurationer , men du er ikke forpligtet til at installere MongoDB. Forbeholdet her er, at du er prisgivet den ORM, du vælger.



  1. Analyse af langsomme forespørgsler i MongoDB

  2. Mongodb Healthcheck Trin for Trin

  3. Hvornår skal man bruge et nøgle-/værdilager såsom Redis i stedet for/ved siden af ​​en SQL-database?

  4. MongoDB:Hvordan definerer man et skema?