3

モカとスーパーテストを使用してテストする、エクスプレスで実行されているhttpsサーバーがあります。

私の問題は、テストのみを実行した場合、問題ありません。テストでgruntfileを実行してからexpressを実行しようとすると、テストファイルでafter()をapp.close()で実行しても、多くのEADDRINUSEエラーが表示されます。同じことがテストの監視タスクにも当てはまります。

これが私の例のテストです:

/* jshint node: true*/
/*global describe, it, after*/
(function() {
    'use strict';
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
    var request = require('supertest');
    var app = require('../server.js').app;
    var expect = require('chai').expect;
    var Cookies;

    after(function(done) {
        app.close();
        setTimeout(function(){done();}, 1500);
    });

    describe('/login', function() {
        it('should auth the user', function(done) {
            request(app)
                .post('/login')
                .send({login: "test", password: 'test'})
                .expect(302)
                .end(function(err, res) {
                    expect(err).to.be.equal(null);
                    expect(res.text).to.be.equal("Moved Temporarily. Redirecting to /");
                    Cookies = res.headers['set-cookie'].pop().split(';')[0];
                    done();
            });

        });
    });
    // testing API for serving session data for angualar factory
    describe('/api/session', function() {
        it('should return session data in JSON', function(done) {
            var req = request(app).get('/api/session');             
                req.cookies = Cookies;
                req.set('Accept','application/json')
                .end(function(err, res) {
                    expect(err).to.be.equal(null);
                    expect(res.body).to.have.property("_id");
                    done();
            });
        });
    });

}());

これらのテストは完璧にはほど遠いことを認識しています。適切なソフトウェア テストの冒険を始めたばかりです。

これらの「既に使用されているポート」はすべて明らかであり、どれも...問題を引き起こしません。すべてのテストは正常に動作し、サーバーは正常に動作しますが、stdout はクレイジーです。このような動作は理想とはほど遠いものであり、おそらく潜在的な問題や不安定性の問題に満ちています。

私の質問は - どうすればそれを取り除くことができますか?

私のアイデアは次のとおりです。

  • 異なるポートだけでテスト用の専用サーバーを作成します。残念ながら、これを実装する方法を知る必要があります。

  • スーパーエージェントが実行されていない場合にサーバーを実行するための条件を作成するか、それ以外の場合はスーパーエージェントに渡しますか?

  • スーパーエージェント以外のものを使用します(リクエストなどですが、すべてのCookieとnode_tls_reject_unauthorizedが機能するかどうかはわかりません.

ご覧のとおり、私はそのトピックに苦労しており、答えよりも多くの質問があり、どこを見ればよいかを知るのに十分な経験がありません.

助けていただければ幸いです。

編集:

私ができることがわかりました:

before(function(done) {
    app.listen(3001, function() { done(); });
});

これは別のポートでテストを開始しますが...とにかくserver.js全体がロードされるため、とにかく開始します。次に、実行中のサーバーと一緒に起動すると、明らかな EADDRINUSE があります。

4

1 に答える 1

6

を使用するsuperagent場合は、必ず構成済みの Express アプリケーション (ミドルウェアの登録、コントローラーのルーティングなど) を渡す必要がありますが、HTTP サーバーとして初期化されていません。それはあなたのためにそれをhttp.createServer行い、利用可能なポートを選択するためにOSに任せます。

現在、server.jsモジュールが本格的な HTTP サーバーの静的インスタンスを既に提供している場合は、それが問題の原因である可能性が最も高いです。どちらの場合も、次のように実際のサーバーのインスタンス化からアプリケーション構成/ブートストラップを抽出してみてください。

// server.js
var express = require('express');
var middleware = require('./middleware');
var controllers = require('./controllers');

// Configures the Express application instance.
exports.setup = function (app) {
    app.use(middleware.foo);
    app.get('/bar', controllers.bar);

    app.locals.baz = 'quux';
}

// You might shoot yourself in the foot if parts of your application depend
// on a static reference at `server.app`.
exports.app = setup(express());
exports.app.listen(3000);

次に、テストで、次の行に沿って何かを実行できます。

// tests.js
var express = require('express');
var server = require('./server');

describe('Server tests', function () {
    // Create a fresh server instance prior to each test
    beforeEach(function createNewSever() {
        this.app = server.setup(express());
    });

    describe('Foo', function () {
        it('barrs', function () {
            request(this.app)  // initializes a server instance on port A
            // ... supertests
        });

        it('bazzes', function () {
            request(this.app)  // initializes a server instance on port B
            // ... more supertests
        });
    });
});

これは、アプリケーション インスタンスをいつ/どのようにインスタンス化するかがテスト コンテキストに依存する場合の説明を目的としたものです。重要なことは、テスト ケース用に新鮮でクリーンな、独立した分離されたサーバー インスタンスを作成できる必要があるということです。テストを並行して、またはランダムな順序で実行するテスト ランナーを使用する場合、これは絶対に必要です。

于 2014-07-29T21:01:32.840 に答える