2016-08-09 63 views
0

Was ist der beste Weg, um Tests mit npm zu starten, um einen Node.js Server zu starten und dann den Test Befehl auszuführen? Ich versuche folgendes in meinem package.json, aber es ist fehlgeschlagen. Hinweis, ich muss node api.js im Hintergrund aufrufen und dann möchte ich es beenden, nachdem der jasmine-node Befehl beendet ist.npm Test mit Start des Node.js Servers

"scripts": { 
    "test": "node api.js & && jasmine-node test" 
} 
+0

Haben Sie darüber nachgedacht, die App in Ihren Tests zu booten? – Seth

Antwort

1

Sie können einen Versuch mit Supertest geben, damit Sie simulieren den Server (Einstellung eines Agenten nach oben) und schalten Sie ihn aus, wenn Tests durchgeführt werden. Dies vermeidet auch einige knifflige Hacks, um den Serverprozess nach Abschluss der Tests herunterzufahren.

Edit: Der Vorteil bei Supertest statt frisby ist, dass Sie nicht über eine vollständige URI aufrufen müssen, können Sie Setup ein Agent aus dem App-Objekt (zB ist von Supertest readme):

var request = require('supertest'); 
var express = require('express'); 

var app = express(); 

app.get('/user', function(req, res) { 
    res.status(200).json({ name: 'tobi' }); 
}); 

request(app) 
    .get('/user') 
    .expect('Content-Type', /json/) 
    .expect('Content-Length', '15') 
    .expect(200) 
    .end(function(err, res) { 
    if (err) throw err; 
    }); 
+0

Ich benutze bereits http://frisbyjs.com/ (frisby), um es trotzdem zu tun? – Justin

+0

Es scheint, dass Sie eine explizite URI mit Frisby aufrufen müssen. Mit Supertest können Sie Ihren eigenen Agenten einrichten (siehe Bearbeiten der Antwort). – Cyril

0

Ended schreiben ein einfaches Bash-Skript bin/test-runner.bash, um damit umzugehen.

#!/usr/bin/env bash 
set -eo pipefail; [[ $TRACE ]] && set -x 

node api.js & SERVER_PID=$! 
sleep 1 
jasmine-node test 
kill "$SERVER_PID" 

Dann modifiziert, um den package.json Testbefehl zu ./bin/test-runner.bash. Die einzige hässliche Sache ist der willkürliche Schlafbefehl, aber es funktioniert für jetzt konsequent.