1

test.done()node.js と nodeunit の速度を上げようとしていますが、いずれかのテストで呼び出しが表示されないという nodeunit の問題を見つけています。

コード:

// Added for clarity.
var client = require("restify").createJsonClient({
    "version": "*",
    "url": "http://localhost:" + server.Port
});

exports["tests"] = {
    "setUp": function (callback) {
        server.StartServer();
        callback();
    },
    "tearDown": function (callback) {
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },

    // Note: I expect this test to fail as it is a copy of the above
    //       test on a different url that doesn't return the ImATeapot
    //       HTTP error. But it doesn't look like it's detecting it
    //       properly.

    "TakeThisInfo": function (test) {
        test.expect(4);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    }
};

出力:

FAILURES: Undone tests (or their setups/teardowns):
- tests - TakeThisInfo

To fix this, make sure all tests call test.done()

私はそれが愚かなことであることを願っています。

バージョン:-

Node: 0.10.21
NPM: 1.3.11
Nodeunit: 0.8.2
Grunt-CLI: 0.1.10
Grunt: 0.4.1
4

4 に答える 4

3

まず、コード内の「サーバー」が何であるかはわかりませんが、非同期であると予想されるため、 setUp 関数に次のようなものを含める必要があります。

function (callback) {
  server.StartServer(function(){
    callback();
  });
}

次に、すべてのテストの前後に nodeunit が startUp および tearDown 関数を実行することを確認してください。そのため、サーバーを 2 回起動していると思われます (tearDown のように、実際には閉じていません)。

于 2013-11-09T23:06:44.820 に答える
1

セットアップでサーバーを独自のプロセスにフォークし、ティアダウンでサーバーを強制終了することで、この問題を回避しています。問題は、シャットダウンではなく作成中のサーバーに関係していたと考えてください。@matteofigus に感謝します。

var cp = null; // child process
exports["tests"] = {
    "setUp": function (callback) {
        cp = fork("./lib/server.js", {"silent": true});
        callback();
    },
    "tearDown": function (callback) {
        cp.kill("SIGHUP");
        callback();
    },
    "CanIHaveSomeTeaPlease?": function (test) {
        test.expect(4);
        client.get("/tea", function (err, req, res, data) {
            test.equal(err.statusCode, 418, "Expected ImATeapot Error.");
            test.equal(err.message, "Want a biscuit?", "Expected to be asked if I want a buscuit.");
            test.equal(err.restCode, "ImATeapotError");
            test.equal(err.name, "ImATeapotError");
            test.done();
        });
    },
    "TakeThisInfo": function (test) {
        test.expect(1);
        client.put("/push", {
            "hello": "world"
        }, function (err, req, res, data) {
            test.ok(false);
            test.done();
        });
    }
};
于 2013-11-11T10:03:18.423 に答える
1

私はあなたが実際test.done()にその 2 番目のテストで呼び出していないと思われます。そこconsole.log()に電話をかけて、実際にその電話をかけていることを確認します。

FWIW、以下のテストの簡略化されたバージョンを使用して、説明されている問題を再現しました。ハンドラーを省略するとon('error', function() {...})、2 番目のテストは完了しません。したがって、私の理論では、/pushエンドポイントが restify モジュールで別の動作をトリガーしているということです。つまり、restify がそこにあるプロパティでコールバックを呼び出していると確信していますか、それとも何か違うことをしていますか? err... たとえば、http.get以下のようにイベントを発行します。

var http = require('http');

exports.test1 = function (test) {
  test.expect(1);
  http.get({hostname: "www.broofa.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  });
};

exports.test2 = function (test) {
  test.expect(1);
  http.get({hostname: "www.no-such-domain.com", path: "/"}, function (res) {
    test.equal(res.statusCode, 200, 'got 200');
    test.done();
  }).on('error', function() {
    // Comment line below out to repro the "Undone tests" error
    test.done();
  });
};
于 2013-11-09T14:21:06.637 に答える