Vollständige Integrationstests für NodeJS und die Clientseite mit Yeoman und Mocha
Bekam ich genial client-side tests, die ich laufen mit Yeoman. Yeoman kompiliert meine CoffeeScript, öffnet sich der test-Seite in einem server, besuchen Sie mit PhantomJS und übergeben Sie alle tests, die Ergebnisse an die command line. Der Prozess ist ziemlich hacky, die test-Ergebnisse werden weitergegeben über alert()
Nachrichten für die Phantom-Prozess erstellt eine temporäre Datei und füllt es mit den Nachrichten als JSON. Yeoman - (naja, Grunt) - Schleifen über die temporäre Datei, analysiert die tests und zeigt diese in der Befehlszeile.
Den Grund habe ich erklärt, das Verfahren ist, dass ich möchte hinzufügen, ein paar Dinge. Ich habe server-side-tests als gut. Verwenden Sie mocha und-supertest, überprüfen Sie die API-Endpunkte und einen Redis-client um sicherzustellen, dass die Datenbank-Zustand ist als erwartet. Aber ich will mischen Sie die beiden test-suites!
Möchte ich nicht schreiben der client-Seite mock-Antwort für den server ruft. Ich will nicht senden Sie die server-mock-Daten. Irgendwo auf dem Weg werde ich ändern der server-oder der client-und der test wird nicht scheitern. Ich will eine echte integration testen. Also, wenn ein test beendet der client-Seite möchte ich einen Haken an führen Sie einen entsprechenden test auf der server-Seite (überprüfung der db-Zustand, den Sitzungszustand, den übergang zu einer anderen test-Seite).
Gibt es irgendwelche Lösungen dafür? Oder, altenatively, wo fange ich hacking auf Yeoman /Grunt /grunt-mocha diese Arbeit zu machen?
Ich denke, die Phantom-Handler in grunt-mocha ist ein guter Ort, um zu starten:
//Handle methods passed from PhantomJS, including Mocha hooks.
var phantomHandlers = {
//Mocha hooks.
suiteStart: function(name) {
unfinished[name] = true;
currentModule = name;
},
suiteDone: function(name, failed, passed, total) {
delete unfinished[name];
},
testStart: function(name) {
currentTest = (currentModule ? currentModule + ' - ' : '') + name;
verbose.write(currentTest + '...');
},
testFail: function(name, result) {
result.testName = currentTest;
failedAssertions.push(result);
},
testDone: function(title, state) {
//Log errors if necessary, otherwise success.
if (state == 'failed') {
//list assertions
if (option('verbose')) {
log.error();
logFailedAssertions();
} else {
log.write('F'.red);
}
} else {
verbose.ok().or.write('.');
}
},
done: function(failed, passed, total, duration) {
var nDuration = parseFloat(duration) || 0;
status.failed += failed;
status.passed += passed;
status.total += total;
status.duration += Math.round(nDuration*100)/100;
//Print assertion errors here, if verbose mode is disabled.
if (!option('verbose')) {
if (failed > 0) {
log.writeln();
logFailedAssertions();
} else {
log.ok();
}
}
},
//Error handlers.
done_fail: function(url) {
verbose.write('Running PhantomJS...').or.write('...');
log.error();
grunt.warn('PhantomJS unable to load "' + url + '" URI.', 90);
},
done_timeout: function() {
log.writeln();
grunt.warn('PhantomJS timed out, possibly due to a missing Mocha run() call.', 90);
},
//console.log pass-through.
//console: console.log.bind(console),
//Debugging messages.
debug: log.debug.bind(log, 'phantomjs')
};
Dank! Es wird ein Kopfgeld auf dieser.
InformationsquelleAutor der Frage CamelCamelCamel | 2012-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, über Yeoman - ich habe nicht versucht es noch, aber ich habe den rest des Puzzles zu laufen. Ich glaube, Sie werden herausfinden, die Ruhe.
Warum Tun Integrations-Tests?
In Ihrer Frage, die Sie redeten über die situation, wenn Sie sowohl client-side-tests und server-side-tests, läuft mit mocks. Ich gehe davon aus, dass Sie aus irgendeinem Grund nicht bekommen können, beide test-sets laufen mit der gleichen verspottet. Andernfalls, wenn Sie geändert haben den mocks auf der client-Seite die server-seitige tests fehlschlagen würde, weil Sie die gebrochenen mock-Daten.
Was Sie brauchen, sind die Integrations-tests, so dass, wenn Sie einige client-side code in Ihrem headless-browser, server-side-code würde auch laufen. Zudem, einfach durch das ausführen der server-side und client-side-code ist nicht genug, Sie wollen auch in der Lage, die Behauptungen auf beiden Seiten, nicht wahr?
Integration Tests mit Knoten und PhantomJS
Meisten Beispiele von integration tests, die ich online gefunden haben, verwenden Sie entweder Selen oder Zombie.js. Die erstere ist eine große, Java-basierte framework zu fahren real-Browser, während das später ist ein einfacher wrapper um jsdom. Ich nehme an, Sie sind zögerlich, um entweder von denen, und würde lieber PhantomJS. Der schwierige Teil, natürlich, ist zu bekommen, dass von Ihrem Knoten-app. Und ich bekam genau das.
Gibt es zwei Knoten, Module, Laufwerk PhantomJS:
Leider beide Projekte scheinen verlassen, die von Ihren Autoren und anderen community-Mitgliedern Gabel Ihnen und Ihren Bedürfnissen anzupassen. Das bedeutet, dass beide Projekte Gabel mehrfach und alle Gabeln sind kaum ausgeführt. Die API ist fast nicht existent. Ich habe meine tests laufen mit einer der phantom-Gabeln (Danke, Seb Vincent). Hier ist eine einfache app:
Er lauscht auf Anfrage
/user
und gibt Pfad-parametername
- und query-parametersecret
. Hier ist die Seite wo ich den server aufrufen:Und hier ist ein einfacher test:
Wie Sie sehen können, habe ich den server Abfragen innerhalb der timeout-Zeit. Das ist, weil alle phantom-Bindungen sind unvollständig und zu begrenzen. Wie Sie sehen können ich bin in der Lage zu überprüfen, sowohl client-Status und server-Status in einem einzigen test.
Führen Sie Ihre tests mit Mokka:
mocha -t 2s
Sie werden wahrscheinlich brauchen, um erhöhen Sie die Standard-timeout-Einstellung für die weiter entwickelten tests.So, wie Sie sehen können, die ganze Sache machbar ist. Hier ist das repo mit komplette Beispiel.
InformationsquelleAutor der Antwort Andrew Андрей Листочкин