2015-03-21 19 views
9

Voglio assicurarmi che nel caso il codice sia in esecuzione in modalità test, che non acceda (accidentalmente) al database sbagliato. Qual è il modo migliore per rilevare se il codice è attualmente in esecuzione in modalità test?Come rilevare se un test di moka è in esecuzione in node.js?

+0

Il modo migliore per evitare che sarebbe in realtà il livello dati fittizio in realtà –

+0

Dove stai eseguendo i test che hanno accesso alle risorse di produzione? Questo dovrebbe essere risolto a livello di rete. I database di produzione dovrebbero accettare solo connessioni da macchine di produzione. –

+0

... potrebbe non essere l'ambiente di produzione. Voglio assicurarmi che i test vengano eseguiti con l'ambiente di test. In caso contrario, vorrei lanciare un errore. –

risposta

12

Come già accennato nel commento, è una cattiva pratica creare il codice in modo consapevole dei test. Non riesco nemmeno a trovare l'argomento menzionato su SO e anche all'esterno. Tuttavia, posso pensare a modi per rilevare il fatto di essere lanciato in prova. Per me mocha non si aggiunge allo scope global, ma aggiunge global.it. Così il vostro assegno può essere

var isInTest = typeof global.it === 'function'; 

vorrei suggerire di essere sicura di non falso-detect per aggiungere controllo per global.sinon e global.chai che è più probabile l'utilizzo nelle prove di Node.js.

+0

Ora sta per creare il codice in base ai test. Voglio generare un errore se qualcuno scrive un test che viene eseguito con le impostazioni di distribuzione. L'idea è di proteggere alcune funzioni "pericolose" dall'essere casualmente chiamate da un test non configurato correttamente (come far cadere una tabella sul sistema di produzione). –

+0

Un altro uso improprio ... L'ambiente dello sviluppatore non dovrebbe occuparsi della configurazione di produzione se non si risolvono i problemi. La configurazione dello sviluppatore dovrebbe essere in grado di raggiungere solo l'ambiente locale o almeno lo stage, ma non la produzione. Tuttavia, è tutto commenti e consigli, la risposta è fornita. Non dimenticare di far sapere alla community se è adatta alle tue esigenze o è falsa –

+0

Sono quei casi di "risoluzione dei problemi", gli sviluppatori tendono a dimenticare di essere connessi al database reale ed eseguire un test che potenzialmente distrugge i dati ... –

3

L'ispezione di process.argv è un buon approccio nella mia esperienza.

Per esempio se io console.log(process.argv) durante un test ottengo il seguente:

[ 
    'node', 
    '/usr/local/bin/gulp', 
    'test', 
    '--file', 
    'getSSAI.test.unit.js', 
    '--bail', 
    '--watch' 
] 

Da cui si può vedere che gulp è in uso. L'utilizzo di yargs rende l'interpretazione molto più semplice.

Sono assolutamente d'accordo con Kirill e in generale che il codice non dovrebbe essere consapevole del fatto che è in fase di test (nel tuo caso forse potresti passare il tuo binding/connessione db tramite un costruttore?), Per cose come la registrazione Posso capire perché potresti voler rilevare questo.

+6

L'unica ragione per cui ho bisogno di verificare se l'applicazione è in esecuzione sotto test è un controllo che non sono connesso a un database di produzione, perché i test cancellano il database. Solo pura paranoia, perché non dovrebbe mai accadere - ma in 30 anni in questo business, ho visto molte cose sbagliate che sono state dichiarate come "che non accadrà mai". –

Problemi correlati