Node.js 如何使用Mocha测试群集Express应用程序?
以下是我的cluster Express应用程序的简化版本: /index.jsNode.js 如何使用Mocha测试群集Express应用程序?,node.js,express,Node.js,Express,以下是我的cluster Express应用程序的简化版本: /index.js module.exports = process.env.CODE_COV ? require('./lib-cov/app') : require('./lib/app'); var cluster = require('cluster'), express = require('express'), app = module.exports = express.createSe
module.exports = process.env.CODE_COV
? require('./lib-cov/app')
: require('./lib/app');
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);
}
}
var app = require('../');
app.listen(7777);
// send requests to app, then assert the response.
var app = require('../');
app.listen(7777);
// send requests to app, then assert the response.
/lib/app.js
module.exports = process.env.CODE_COV
? require('./lib-cov/app')
: require('./lib/app');
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);
}
}
var app = require('../');
app.listen(7777);
// send requests to app, then assert the response.
var app = require('../');
app.listen(7777);
// send requests to app, then assert the response.
问题:
var-app=require('../')代码>在此群集环境中不起作用。它应该返回哪些工作应用程序?它应该返回集群对象而不是Express应用程序吗
if(module.parent.parent)…
)
用摩卡测试集群Express应用程序还有其他方法吗?我已经很久没有发布这个问题了。既然没有人回答,我将自己回答这个问题 我保持了/index.js的原样:
module.exports = process.env.CODE_COV
? require('./lib-cov/app')
: require('./lib/app');
在启动集群的/lib/app.js中,我有以下代码。简而言之,我只在非测试环境中启动集群。在测试环境中,集群未启动,但仅启动一个应用程序/工作者本身,如cluster.isMaster&!module.parent.parent
条件
var cluster = require('cluster'),
express = require('express'),
app = module.exports = express.createServer();
if (cluster.isMaster && !module.parent.parent) {
// 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);
}
}
同时,如果我需要实际运行应用程序,即不是为了测试,那么我运行
node index.js
,它将启动应用程序集群。我有点喜欢您的解决方案,因为它简单,但是,在类似于节点MVC框架的环境中,您可能会链接module.parent多达11次(严肃地说)
我认为更好的方法是简单地检查哪个脚本节点开始处理。节点的命令行参数在process.argv中可用。
此数组中的第一项是“node”,可执行文件,第二个参数是节点开始执行的文件的路径。在本例中,这将是index.js
因此,与其检查
module.parent.parent
^ ^
(app.js) |
(index.js)
你可以这样做
var starter = process.argv[1].split(path.sep).pop();
其中,starter
将是index
或index.js
,具体取决于您启动服务器的方式。
node index.js
vsnode index
然后,该支票将类似于:
if (cluster.isMaster && starter === 'index.js') {
cluster.fork();
}
在我的环境中工作-我希望这会有所帮助!我有一个更简单的方法来做这件事
if (process.env.NODE_ENV !== 'test') {
if (cluster.isMaster) {
var numCPUs = require('os').cpus().length;
console.log('total cpu cores on this host: ', numCPUs);
for (var i = 0; i < numCPUs; i++) {
console.log('forking worker...');
cluster.fork();
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online.');
});
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died.');
});
} else {
console.log('Im a worker');
// application code
setupServer()
}
} else {
// when running tests
setupServer();
}
if(process.env.NODE_env!=“test”){
if(cluster.isMaster){
var numpus=require('os').cpus().length;
log('此主机上的cpu内核总数:',numpus);
对于(变量i=0;i
运行测试时,只需确保将env设置为test
例如:
NODE\u ENV=test-grunt-test
这种假设看起来很危险,因为我不知道参数列表将如何运行,例如,如果应用程序始终执行或像pm2一样的守护进程。您知道参数列表将如何运行。参数列表将始终包含0:“NODE”,和1:节点正在处理的脚本。我认为您将cpu线程与节点子进程混淆了。如果您使用诸如forever之类的守护进程监视器,forever将启动相应的主进程,然后该主进程将委托不同的fork来运行您的应用程序。如果forever fork启动了您的应用程序,它仍在运行node app.js
它将启动一个节点进程,并使用process.argv
作为['node','path/to/app.js']。如果您使用mocha并编写一个测试单元来执行类似exec('node-app.js')
,process.argv仍然是['node',path/to/app.js']
。您正在检查给定节点的入口点。在我的情况下,节点入口点是sails.js
,而不是index.js
。因此,如果您说这很危险,因为您的文件名是index.js
,那么也许您可以使用更多路径来识别入口点。这肯定是一个更好的解决方案而不是确定当前文件是否是require树中的确切的n
子文件。