Tutaj jest uproszczoną wersją mojego klastra ekspresowe aplikacji:Jak przetestować klastrowaną aplikację Express z aplikacją Mocha?
/index.js
module.exports = process.env.CODE_COV
? require('./lib-cov/app')
: require('./lib/app');
/lib/app.js
var cluster = require('cluster'),
express = require('express'),
app = module.exports = express.createServer();
if (cluster.isMaster) {
// Considering I have 4 cores.
for (var i = 0; i < 4; ++i) {
cluster.fork();
}
} else {
// do app configurations, then...
// Don't listen to this port if the app is required from a test script.
if (!module.parent.parent) {
app.listen(8080);
}
}
/test/test1 .js
var app = require('../');
app.listen(7777);
// send requests to app, then assert the response.
Pytania:
var app = require('../');
nie będzie działać w tym środowisku klastra. Która z aplikacji dla robotników powinna powrócić? Czy powinien zwrócić obiekt klastra zamiast aplikacji Express?- Teraz oczywiście ustawienie portu w skrypcie testowym nie będzie działać. Jak ustawić port w skrypcie testowym do klastra aplikacji?
- Jak wysyłać żądania do tej grupy aplikacji?
Jedyne rozwiązanie, jakie mogę wymyślić, to warunkowo wyłączyć funkcję klastrowania i uruchomić tylko jedną aplikację, jeśli aplikacja jest żądana ze skryptu testowego (if (module.parent.parent) ...
).
Każdy inny sposób przetestowania klastrowej aplikacji Express z aplikacją Mocha?
Ten rodzaj założeniu wygląda niebezpieczne, bo don” t wiedzieć, jak zachowa się lista argumentów, jeśli na przykład aplikacja zostanie uruchomiona na zawsze lub PM2 jak demony. – Eye
Wiesz, jak zachowa się lista argumentów. [process.argv] (http://nodejs.org/docs/latest/api/process.html#process_process_argv) zawsze będzie zawierał 0: "węzeł" i 1: skrypt przetwarzany przez węzeł. – jbielick
Myślę, że mylisz wątek procesora z procesem podrzędnym węzła. Jeśli korzystasz z monitora demona , takiego jak na zawsze, na zawsze rozpocznie się odpowiedni proces główny, który następnie przekaże różne widżety do uruchomienia aplikacji. Jeśli w nieodłącznym widelcu uruchamia się twoja aplikacja, to nadal działa pod ręką 'node app.js'. Który uruchomiłby proces węzłowy z 'process.argv' jako ['node', 'path/to/app.js']. Jeśli używasz mokka i napisać jednostki testowej, aby zrobić coś takiego 'exec ('węzeł app.js')' The process.argv będzie nadal być '[ 'node', 'ścieżka/do/app.js' ] '. – jbielick