2012-11-01 8 views
8

Ho creato una semplice Webapp utilizzando express.js e voglio testarlo con jasmine-node. Funziona bene finora, ma il mio problema è che devo avviare manualmente il server ogni volta prima di poter eseguire i miei test.Automatizza Jasmine-Node ed express.js

Potresti aiutarmi a scrivere un assistente delle specifiche che esegue il server (con un'altra porta e poi il mio sviluppo) solo per i test e poi lo uccide in seguito?

+0

Quale versione di Express stai utilizzando? – srquinn

+0

Sto usando la versione 3.x (3.0.2 adesso). – optikfluffel

risposta

16

Questo è quello che faccio:

ho un server.js di file all'interno della radice del mio progetto nodo che stabilisce l'applicazione del nodo del server licazione (con espresso) ed esporta 2 metodi:

exports.start = function(config, readyCallback) { 

    if(!this.server) { 

     this.server = app.listen(config.port, function() { 

      console.log('Server running on port %d in %s mode', config.port, app.settings.env); 

      // callback to call when the server is ready 
      if(readyCallback) { 
       readyCallback(); 
      } 
     }); 
    } 
}; 

exports.close = function() { 
    this.server.close(); 
}; 

I app.js file sarà semplice a questo punto:

var server = require('./server'); 
server.start({ port: 8000 }); 

Quindi la cartella/file struttura di base sarebbe il seguente :

src 
    app.js 
    server.js 

Avere questa separazione vi permetterà di eseguire il server normalmente:

node src/app.js 

.. e/o richiedere da uno script nodo personalizzato, che potrebbe essere uno script nodo (o un jake/grugnito/qualsiasi compito) che esegue i test in questo modo:

/** my-test-task.js */ 

// util that spawns a child process 
var spawn = require('child_process').spawn; 

// reference to our node application server 
var server = require('./path/to/server.js'); 

// starts the server 
server.start({ port: 8000 }, function() { 

    // on server ready launch the jasmine-node process with your test file 
    var jasmineNode = spawn('jasmine-node', [ '.path/to/test/file.js' ]); 

    // logs process stdout/stderr to the console 
    function logToConsole(data) { 
     console.log(String(data)); 
    } 
    jasmineNode.stdout.on('data', logToConsole); 
    jasmineNode.stderr.on('data', logToConsole); 

    jasmineNode.on('exit', function(exitCode) { 
     // when jasmine-node is done, shuts down the application server 
     server.close(); 
    } 
}); 
+0

Ok, ho capito fino a ora. Se mi dici ora come eliminare l'output del server (come: _GET/200 46ms - 167_) nel mio test-output tutto bene :) – optikfluffel

+0

Sembra che tu abbia qualcosa configurato nell'app del tuo server del nodo che registra le richieste, forse un middleware di profiler per express? Controlla il tuo codice server express;) – BFil

+0

Siamo spiacenti, ho trovato un'app dimenticata (express.logger ('dev')); Grazie ^^ – optikfluffel

0

Io uso Mocha - che è dannatamente simile - ma lo stesso principio dovrebbe valere: si potrebbe provare require ing il file app.js in un gancio 'beforeeach' all'interno del principale describe. Questo dovrebbe accenderlo per te.

+0

OK allora si avvia e i test sono in esecuzione ma non si ferma e fallisce se uso l'opzione --autotest (o faccio qualcosa di simile) e non si ferma se voglio eseguire i test solo una volta. Inoltre, ora ho l'output http (GET/200 6ms - 167) nel mio output di test. Come faccio a liberarmi di questo? – optikfluffel

+0

hai un esempio di questo? – chovy

+0

Ecco un esempio dell'output: http://pastebin.com/9qF1NeU1 e qui del server_spec.coffee: http: // pastebin.com/uvcBuTiy – optikfluffel

0

Supponendo di utilizzare un codice che richiama app.listen() in server.js, non richiedono il file su ogni corsa, ma solo una volta e poi hanno due funzioni come

startServer = -> app.listen(3000) 
stopServer = -> app.close() 

Quindi è possibile utilizzare questi in beforeEach e afterEach

+0

non funziona, lo snippet di @ShadowCloud è bello :) – optikfluffel

-1

Se si vuole poi a fare un passo avanti per automatizzare il test mentre si sviluppa, si può andare alla vostra linea terminale ed eseguire

jasmine-node . --autotest 

Jasmine poi rimarrà lista ening a ogni file all'interno del progetto e ogni volta che si apportano modifiche a uno, si dirà se quel pezzo del codice interrompe uno dei test;)