Node.js 如何使用Mocha测试群集Express应用程序?

Node.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

以下是我的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.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
    vs
    node 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
    子文件。