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

Come testare un metodo che si collega a mongo, senza effettivamente connettersi a mongo?

Ci sono un paio di risposte SO relative al codice di unit test che utilizza MongoDB come archivio dati:

  • Database derisorio in node.js?
  • Mock/Test database Mongodb Node.js
  • MongoDB incorporato durante l'esecuzione dei test di integrazione
  • Simile:classi di unit test con funzionalità online

Cercherò di consolidare queste soluzioni.

Preambolo

Innanzitutto, dovresti desidera che MongoDB sia in esecuzione durante l'esecuzione dei test. Il linguaggio di query di MongoDB è complesso, quindi è necessario eseguire query legittime su un'istanza MongoDB stabile per garantire che le query vengano eseguite come pianificato e che l'applicazione risponda correttamente ai risultati. Con questo in mente, tuttavia, dovresti mai eseguire i test su un sistema di produzione, ma invece un sistema periferico nel proprio ambiente di integrazione. Questo può trovarsi sulla stessa macchina del tuo software CI o semplicemente relativamente vicino ad esso (in termini di processo, non necessariamente di rete o geograficamente parlando).

Questo ENV potrebbe avere un ingombro ridotto ed essere eseguito completamente in memoria (risorsa 1) (risorsa 2), ma non richiederebbe necessariamente le stesse caratteristiche prestazionali dell'ENV di produzione. (Se desideri eseguire un test delle prestazioni, questo dovrebbe comunque essere gestito in un ambiente separato dal tuo CI.)

Configurazione

  • Installa un mongod servizio specifico per CI. Se i repl set e/o lo sharding sono preoccupanti (ad es. scrivi preoccupazione, nessun uso di $isolated , ecc.), è possibile simulare un ambiente cluster eseguendo più mongod istanze (1 configurazione, dati 2x2 per shard+repl) e un mongos istanza sulla stessa macchina con alcuni script/tweak init.d o qualcosa come la finestra mobile.
  • Utilizza configurazioni specifiche dell'ambiente all'interno della tua applicazione (o incorporata tramite file .json o in qualche posto come /etc, /home/user/.your-app o simili). La tua applicazione può caricarli in base a una variabile di ambiente del nodo come NODE_ENV=int . All'interno di queste configurazioni le stringhe di connessione del tuo db saranno diverse. Se lo sei non utilizzando le configurazioni specifiche di env, inizia a farlo come mezzo per astrarre le impostazioni di runtime dell'applicazione (ad esempio "local", "dev", "int", "pre", "prod", ecc.). Posso fornire un campione su richiesta.
  • Includi dispositivi orientati ai test con la tua applicazione/suite di test. Come menzionato in una delle domande collegate, il driver Node.js di MongoDB supporta alcune librerie di supporto:mongodb-fixtures e node-database-cleaner . I dispositivi forniscono un set di dati funzionante e coerente per i test:considerali come un bootstrap.

Costruzioni/Test

  1. Pulisci il database associato usando qualcosa come node-database-cleaner .
  2. Popola i tuoi proiettori nel database ora vuoto con l'aiuto di mongodb-fixtures .
  3. Esegui la compilazione e il test.
  4. Ripeti.

D'altra parte...

Se decidi ancora che non l'esecuzione di MongoDB è l'approccio corretto (e non saresti l'unico), quindi l'astrazione delle chiamate del tuo archivio dati dal driver con un ORM è la soluzione migliore (per l'intera applicazione, non solo per i test). Ad esempio, qualcosa come model afferma di essere indipendente dal database, anche se non l'ho mai usato. Utilizzando questo approccio, avresti comunque bisogno di infissi e configurazioni ambiente , tuttavia non ti verrà richiesto di installare MongoDB. L'avvertenza qui è che sei alla mercé dell'ORM che scegli.