0

Mocha を使用して Node/Express.js サービスをテストしています。これらを Grunt で自動化して、サーバーのテスト インスタンス (つまり、異なるポートでリッスンするだけの同一の構成) に対して実行したいと考えています。

grunt-contrib-connect を使用してサーバーの新しい (読み取り: 構成されていない) インスタンスを起動することはできますが、すべての API パス、ミドルウェアなどを含む既存の app.js ディレクティブを利用する方法はないようです。 . いくつかの選択肢がありますが、どちらも魅力的ではありません:

  1. ドキュメントと例によると - https://github.com/gruntjs/grunt-contrib-connect/blob/master/Gruntfile.js - 関連するすべてのステートメントを構成ファイルから「ミドルウェア」に渡すことができましたオプションですが、これは可能な限り車輪の再発明のケースであるように見えます.

  2. 一方、grunt-exec -- https://github.com/jharding/grunt-exec -- を使用してノードを起動し、通常どおり構成ファイルを環境変数 (NODE_ENV= など) と共に渡します。 test) 上記の構成ファイルを別のポートにバインドさせます。残念ながら、このコマンドはテストの実行をブロックし、終了時にシャットダウンするには別のハックが必要になります。

したがって、私はアイデアを受け入れます!grunt と mocha でテストできるように、完全な config ディレクティブでノード サーバーを自動的に起動する最もエレガントな方法は何ですか?

4

1 に答える 1

2

テストから実行するときに別のポートで起動するように app.js を構成します。これにより、(nodemon を使用して) 開発サーバーを通常のポートで同時に実行し続けることができます。コードは次のとおりです。

// Start server.

if (process.env.TEST == 'true') {
    var port = process.env.PORT || 3500; // Used by Heroku and http on localhost
    process.env['PORT'] = process.env.PORT || 4500; // Used by https on localhost
}
else {
    var port = process.env.PORT || 3000; // Used by Heroku and http on localhost
    process.env['PORT'] = process.env.PORT || 4000; // Used by https on localhost
}

http.createServer(app).listen(port, function () {
    console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});

// Run separate https server if not on heroku
if (process.env.HEROKU != 'true') {
    https.createServer(options, app).listen(process.env.PORT, function () {
        console.log("Express server listening with https on port %d in %s mode", this.address().port, app.settings.env);
    });
};

次に、favicon の提供をテストするこのような mocha ファイルは、次のようになります。

process.env['TEST'] = 'true'; // Use test database
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs
var request = require("request").defaults({ encoding: null });
var crypto = require('crypto');
var fs = require('fs');
var expect = require('expect.js');
var app = require("../../app.js");
var hash = function(file) { crypto.createHash('sha1').update(file).digest('hex') };


describe("Server", function () {
    after(function () {
        process.env['TEST'] = 'false'; // Stop using test database.
    });


    describe("Static tests", function () {
        it("should serve out the correct favicon", function (done) {
            var favicon = fs.readFileSync(__dirname + '/../../../public/img/favicon.ico')
            request.get("https://localhost:" + process.env.PORT + "/favicon.ico", function (err, res, body) {
                // console.log(res)
                expect(res.statusCode).to.be(200);
                expect(hash(body)).to.be(hash(favicon));
                done();
            });
        });
    });
});

また、grunt は優れたツールですが、package.json スクリプト セクションから mocha を呼び出しnpm testて実行することもできます。

于 2013-06-05T04:16:21.887 に答える