2012-11-01 21 views
8

Stworzyłem prostą aplikację Webapp przy użyciu express.js i chcę przetestować ją za pomocą jasmine-node. Do tej pory działa dobrze, ale moim problemem jest to, że muszę ręcznie uruchomić serwer za każdym razem, zanim będę mógł uruchomić testy.Automatyzacja Jasmine-Node i express.js

Czy możesz mi pomóc, jak napisać pomocnika, który uruchamia serwer (z innym portem, niż mój programistyczny) tylko dla testów, a następnie zabija go?

+0

Jaką wersję ekspresu używasz? – srquinn

+0

Używam wersji 3.x (3.0.2 teraz). – optikfluffel

Odpowiedz

16

to co mam zrobić:

mam server.js plik w katalogu głównym mojego projektu węzła, który konfiguruje aplikację węzła Serwer lication (z Express) i eksportuje 2 metody:

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(); 
}; 

The app.js plik będzie prosta w tym momencie:

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

Więc plików/folderów podstawowa struktura byłyby następujące :

src 
    app.js 
    server.js 

Mając to oddzielenie będzie pozwalają uruchomić serwer normalnie:

node src/app.js 

.. i/lub wymagają go ze skryptu niestandardowego węzła, który mógłby być scenariusz węzeł (lub jake/grunt/cokolwiek zadanie), który wykonuje swoje testy tak:

/** 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 Dostałem go do tej pory. Jeśli powiesz mi teraz, jak pozbyć się danych wyjściowych serwera (takich jak: _GET/200 46ms - 167_) w moim testowym wyjściu wszystko jest w porządku :) – optikfluffel

+0

Wygląda na to, że masz coś skonfigurowanego w aplikacji serwera węzła, które rejestruje żądania, profiler oprogramowania pośredniczącego do ekspresowego może? Sprawdź swój ekspresowy kod serwera;) – BFil

+0

Przepraszamy, znalazłem zapomniane app.use (express.logger ("dev")); Dzięki ^^ – optikfluffel

0

Używam Mokki - która jest cholernie podobna - ale powinna obowiązywać ta sama zasada: możesz spróbować require swojego pliku app.js w haku "beforeEach" wewnątrz głównego describe. To powinno wystrzelić dla ciebie.

+0

OK, to się uruchamia i testy są uruchomione, ale nie zatrzymuje się i nie powiedzie się, jeśli użyję opcji --autotest (lub zrobię podobne) i nie zatrzyma się, jeśli chcę tylko raz uruchomić testy. Na dodatek mam teraz wyjście http (GET/200 6ms - 167) w wynikach testu. Jak się tego pozbyć? – optikfluffel

+0

czy masz tego przykład? – chovy

+0

Oto przykład danych wyjściowych: http://pastebin.com/9qF1NeU1 i tutaj pliku server_spec.coffee: http: // pastebin.com/uvcBuTiy – optikfluffel

0

Zakładając użyć jakiś kod, który wywołuje app.listen() w server.js, nie wymagają plik na każdym biegu, ale tylko raz, a potem mają dwie funkcje jak

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

Następnie można z nich korzystać w beforeEach i afterEach

+0

nie działa, fragment z @ShadowCloud jest fajny :) – optikfluffel

-1

Jeśli chcesz potem iść krok dalej w automatyzacji testów podczas rozwijania, można przejść do linii końcowej i wykonać

jasmine-node . --autotest 

Jasmine następnie pozostanie listy do każdego pliku wewnątrz twojego projektu i za każdym razem, gdy wprowadzisz zmiany do jednego, zobaczysz, czy ten fragment twojego kodu łamie którykolwiek z twoich testów;)