2011-08-17 6 views
10

Ho un server express che sto testando usando i voti. Voglio eseguire il server dall'interno della suite di test di voti, in modo che non sia necessario eseguirlo in background affinché funzioni la suite di test, quindi posso semplicemente creare un'attività di torta che esegue il server e lo verifica in isolamento.Qual è il modo corretto per avviare il server dai voti per il test?

In server.coffee ho creato il (esprimere) del server, configurato, istituito percorsi e chiamato app.listen (porta) in questo modo:

# Express - setup 
express = require 'express' 
app = module.exports = express.createServer() 

# Express - configure and set up routes 
app.configure -> 
    app.set 'views', etc.... 
    .... 

# Express - start 
app.listen 3030 

Nel mio semplice routes-test.js ho:

vows = require('vows'), 
assert = require('assert'), 
server = require('../app/server/server'); 

// Create a Test Suite 
vows.describe('routes').addBatch({ 
    'GET /'  : respondsWith(200), 
    'GET /401' : respondsWith(401), 
    'GET /403' : respondsWith(403), 
    'GET /404' : respondsWith(404), 
    'GET /500' : respondsWith(500), 
    'GET /501' : respondsWith(501) 
}).export(module); 

dove respondsWith(code) è funzionalità simili a quello del documento voti ...

Quando ho require server nella abov e test, avvia automaticamente l'esecuzione del server e i test vengono eseguiti e superati, il che è ottimo, ma non mi sento di farlo nel modo giusto.

Non ho molto controllo su quando il server inizia e cosa succede se voglio configurare il server in modo che punti ad un ambiente di 'test' piuttosto che a quello di default, o cambi il livello di registrazione predefinito per quando sto testando?

PS Ho intenzione di convertire i miei voti in Coffeescript ma per ora è tutto in js come im in modalità di apprendimento dai documenti!

+1

Si potrebbe dare un'occhiata a [Pact] (http://reid.github.com/pact/) - è per testare i server HTTP con i Voti. – Skilldrick

+0

Grazie Skilldrick, controllerà Pact! – cjroebuck

risposta

2

Questa è una domanda interessante perché esattamente la scorsa notte ho fatto quello che volevi fare. Ho una piccola app Node.js CoffeScript che è stata scritta come quella che hai mostrato. Poi, ho refactoring, creando il seguente app.coffee:

# ... Imports 
app = express.createServer() 

# Create a helper function 
exports.start = (options={port:3000, logfile:undefined})-> 
    # A function defined in another module which configures the app 
    conf.configure app, options 
    app.get '/', index.get 
    # ... Other routes 
    console.log 'Starting...' 
    app.listen options.port 

Ora ho un index.coffee (equivalente al vostro server.coffee) il più semplice:

require('./app').start port:3000 

Poi, ho scritto alcuni test utilizzando Jasmine-node e Zombie.js . Il framework di test è diversa, ma il principio è lo stesso:

app = require('../../app') 
# ... 

# To avoid annoying logging during tests 
logfile = require('fs').createWriteStream 'extravagant-zombie.log' 

# Use the helper function to start the app 
app.start port: 3000, logfile: logfile 

describe "GET '/'", -> 
    it "should have no blog if no one was registered", -> 
    zombie.visit 'http://localhost:3000', (err, browser, status) -> 
     expect(browser.text 'title').toEqual 'My Title' 
     asyncSpecDone() 
    asyncSpecWait() 

Il punto è: cosa ho fatto e vorrei suggerire è quello di creare una funzione in un modulo che avvia il server. Quindi, chiama questa funzione dove vuoi. Non so se è "buon design", ma funziona e mi sembra leggibile e pratico.

Inoltre, ho il sospetto che non ci sia ancora un "buon design" in Node.js e CoffeScript. Quelle sono tecnologie nuove e molto innovative. Certo, possiamo "sentire qualcosa che non va" - come in questa situazione, in cui due persone diverse non hanno gradito il design e l'hanno cambiato. Possiamo percepire la "via sbagliata", ma non significa che esista già una "via giusta". Riassumendo, credo che dovremo inventare alcuni "giusti modi" nel tuo sviluppo :)

(Ma è bello chiedere anche dei buoni modi di fare le cose. Forse qualcuno ha una buona idea e la discussione pubblica sarà utile per altri sviluppatori.)

+1

grazie mille, hai ragione che non esiste un modo "giusto" di fare cose con questa tecnologia, ma sapevo che ci sarebbe stato un modo "migliore", purtroppo non c'è un chiaro esempio di questo particolare problema sul web a al momento, almeno non riuscivo a trovarne uno. – cjroebuck

+0

Conosco la tua situazione, ho sempre lo stesso problema. Fortunatamente, la tua domanda ora mette un esempio di questo problema nel web ora :) – brandizzi

+0

questo non funziona se il tuo server fa cluster.fork(). Il server multiplo sarà in esecuzione. – haijin