13

Node.jsはかなり新しい

サーバープロセスを実行し、ファイルを提供する(エクスプレスやフレームワークを使用しない)アプリを作成しました。現在、単体テストを試みています。

そのためにモカテストを使用しようとしています...サーバープロセスを開始し、それに対してリクエストを実行して、期待される結果(統計コード、本文のコンテンツなど)をテストするつもりでした。

ただし、正しく機能しておらず、すべてのリクエストがサーバーに接続できません...ノードが1つのプロセスループを実行しているため、クエリの実行中にサーバーが「バックグラウンド」で実行されていないことが問題であると確信しています。または、要求が行われている間、サーバーがまだ実行されていない(ASYNCを開始している)可能性がありますか?

とにかく、これをテストする適切な方法は何であるか疑問に思っていました。サーバーをバックグラウンドで実行する必要があるか(フォークされたプロセスなど)、またはサーバープロセスを待機する方法を見つける必要があると思います。最初に「アップ」しますが、方法がわかりません。

または、少なくともそのようなサーバープロセスのテストに関する推奨事項(Mochaまたはその他を使用)。

ありがとう。

これがテストコードの例です(元の質問から更新されました)

var server = new Server302('./fixture/');

var instance;

describe('Tests', function() {

before(function(done) {
     instance = http.createServer(function(request, response) {
        console.log(request.url);
        server.serve(request, response);
    }).listen(8000);
    instance.on("listening", function() {
        console.log("started");
        done();
    });
});

after(function(done){
  instance.close();
  console.log("stopped");
  done();
});

it("Should fetch test.html", function(done) {
    console.log("test1");
    http.get("http://localhost:8000/", function(res) {
        res.on('data', function(body) {
            console.log(body)
            expect(body).toEqual("test");
            done();
        });
    })
});

順番に実行されているように見えますが、接続エラーで失敗しますが、ブラウザで手動でテストすると機能します。

started
test1
․․․stopped


  ✖ 1 of 1 tests failed:

  1) Tests Should fetch test.html:
  Error: connect ECONNREFUSED
  at errnoException (net.js:670:11)
  at Object.afterConnect [as oncomplete] (net.js:661:19)
4

3 に答える 3

7

サーバーによって発生する「リスニング」イベントを取得するまで、before呼び出しを行わないでください。done

before(function(done) {
    instance = http.createServer(function(request, response) {
        console.log(request.url);
        server.serve(request, response);
    }).listen(8000);
    instance.on("listening", function() {
        console.log("started");
        done();
    });
});

これにより、サーバーの準備が整う前にテスト接続が開始されないようにする必要があります。

server.listenのドキュメントも参照してください。

于 2012-08-20T01:15:17.523 に答える
1

スーパーテストの使用

SuperTestMochaを使用した完全で簡単な例を次に示します。

var server = new Server302('./fixture/');
var request = require('supertest');

describe('Tests', function() {
  it('Should fetch test.html', function(done) {
    request(server)
      .get('/')
      .expect('test', done);
  });
});

SuperTest では次のことができます。

  • SuperAgentを使用してサーバーをリクエストします(低レベルのhttp エージェントよりもはるかに簡単に使用できます)。
  • サーバーを一時ポートにバインドして、ポートを追跡する必要がないようにします (必要に応じて手動で行うこともできます)。
  • Mocha (またはその他のテスト フレームワーク)で動作する甘い期待メソッドを使用します。
于 2015-04-30T13:11:40.397 に答える