0

Mochaを使用して、現在取り組んでいる Node.js API のテストを作成しようとしています。私が書いている現在のテストは、応答が正しいステータス コードで返されているかどうかを確認することだけに関心があります。応答本文は気にしません。

そのため、次のテストを作成しました。

これは実際のテストではないことに注意してください。プロジェクト固有のものを切り取りました。以下のコードでもエラーが発生します。

var http = require('http');
var assert = require("assert");

before(function() {
    var server = http.createServer(function(req, res) {
        res.end();
    }).listen(8080);
});

describe("Convenience Functions", function() {

    it("should return a 200 status code", function(done) {
        http.get("http://localhost:8080", function(res) {

            assert.equal(res.statusCode, 200);

            res.on('end', function() {

                done();
            });
        });
    });
});

ただし、そのテストを実行すると、Mocha からタイムアウトが発生します。Mocha のデフォルトのタイムアウトは 2000 ミリ秒ですが、それを不必要に高い数値に変更してもタイムアウトする可能性があります。

私はこれと何時間も戦ってきましたが、ついに「修正」を見つけました。テストを次のように変更すると:

describe("Convenience Functions", function() {

    it("should return a 200 status code", function(done) {
        http.get("http://localhost:8080", function(res) {

            assert.equal(res.statusCode, 200);

            res.on('data', function() { })

            res.on('end', function() {

                done();
            });
        });
    });
});

テストがタイムアウトしなくなりました。これら 2 つのテストの唯一の違いは、2 番目のバージョンがdata応答でイベントを処理していることです。データに対して何もせず、リスナーを定義するだけです。今、私のテストは見事に合格しました。

これは簡単に修正できますが、なぜこれを行う必要があるのか​​について非常に混乱しています。を呼び出すとすぐに mocha テストを終了するべきではありませんdone()か?

4

1 に答える 1

2
   http.get("http://localhost:8080", function(res) {
      assert.equal(res.statusCode, 200);
      done();
   });

それだけです。データ/終了イベントは、応答に本文がある場合にのみ役立ちますが、それは気にしないので、done()状態コードを確認する以外は、応答を呼び出して無視してください。

done() を呼び出すとすぐに mocha テストを終了するべきではありませんか?

はい、そうです。最初のスニペットの問題は、endイベントが発生しないため、実際にはdone().

于 2013-09-04T14:56:26.943 に答える