1

サーバーを起動するために start() 関数をエクスポートする server.js モジュールがあります。このモジュールが必要で、index.js からサーバーを起動します。

child_process.fork 呼び出しでサーバーを起動することにより、server.js モジュールを分離して (Mocha を使用して) 単体テストしようとしていますが、エクスポートされた開始関数を呼び出す方法がわかりません。

現在、「index.js」をfork呼び出しに渡すことで機能していますが、オプションをserver.jsモジュールに渡す方法がわかりません(たとえば、ポート番号を送信します)。

これが私のserver.jsと、index.jsを使用する単体テストです(server.start()のみを必要とし、呼び出します)。

環境変数を渡すことができるように、server.js を直接テストしたいと思います。

====編集====

サーバーを別のプロセスで起動することで何が得られると思っていたのかわかりません。
before ブロックでサーバーを起動するようにテストを変更しました。
提案を歓迎します。

var assert = require("assert");
var request = require("request");

describe("Server", function(){
  var server;
  var port = 4008;

  before(function(done){
    server = require("../server");
    server.start(port);
    done();
  });

  it('listens on specified port (' + port + ')', function(done){
    request('http://localhost:' + port, function(err, res, body){
      assert(res.statusCode == 200);
      done();
    });
  });

});
4

1 に答える 1

1

このためにモジュールを使用すると、clusterプロセスの処理が少し簡単になります。以下は、必要なものに沿っている可能性があります。

var cluster = require('cluster');

// Runs only on the master process.
if (cluster.isMaster) {
    var environmentVariables = { PORT: 2020 };

    var worker = cluster.fork(environmentVariables);

    // Catch a message from the worker, and then destroy it.
    worker.on('message', function(message) {
        if (message.hasOwnProperty('testResult')) {
            // Kill the worker.
            worker.destroy();

            // Then do something with the result.
        }
    });
}

// Runs only on a worker process.
if (cluster.isWorker) {
    var server = require('./server');

    server.start();

    // Do some stuff for tests.

    // Send the test result.
    process.send({ testResults: 'pass', failReason: null });
}

私はこれをテストしていませんが、うまくいけば要点は明らかです。ワーカー プロセスが生成されたときにカスタム環境変数を渡し、ワーカー プロセスが結果をマスターにメッセージを送ることができます。おそらく、ワーカーがクラッシュまたはハングアップしたときのために、終了イベントとタイムアウトを処理する必要があります。

余談ですが、おそらく を でラップする必要がありprocess.env.PORTますparseInt

于 2013-01-08T15:13:28.480 に答える