31

node.js で実行され、http API への単純な要求を行う非同期 JavaScript 関数をテストしたいと考えています。

const HOST = 'localhost';
const PORT = 80;

http = require('http');

var options = {
    host: HOST,
    port: PORT,
    path: '/api/getUser/?userCookieId=26cf7a34c0b91335fbb701f35d118c4c32566bce',
    method: 'GET'
};
doRequest(options, myCallback);

function doRequest(options, callback) {

    var protocol = options.port == 443 ? https : http;
    var req = protocol.request(options, function(res) {

        var output = '';
        res.setEncoding('utf8');

        res.on('data', function(chunk) {
            console.log(chunk);
            output += chunk;
        });

        res.on('error', function(err) {
            throw err;
        });

        res.on('end', function() {
            var dataRes = JSON.parse(output);
            if(res.statusCode != 200) {
                throw new Error('error: ' + res.statusCode);
            } else {
                try {
                    callback(dataRes);                        
                } catch(err) {
                    throw err;
                }
            }
        });

    });

    req.on('error', function(err) {
        throw err;
    });

    req.end();

}

function myCallback(dataRes) {
    console.log(dataRes);
}

このコードを実行すると、期待どおりに応答が表示されます。

mocha テストでこれを実行すると、リクエストは実行されません。

describe('api', function() {
    it('should load a user', function() {
        assert.doesNotThrow(function() {
            doRequest(options, myCallback, function(err) {
                if (err) throw err;
                done();
            });
        });
        assert.equal(res, '{Object ... }');
    });
});

問題は、後にコードがないことです:

var req = protocol.request(options, function(res) {

単純なconsole.logすら実行されません。

誰でも助けることができますか?

4

3 に答える 3

47

donemocha に提供される関数 (この場合は関数) への引数としてコールバックを指定する必要がありますit()。そのようです:

describe('api', function() {
    it('should load a user', function(done) { // added "done" as parameter
        assert.doesNotThrow(function() {
            doRequest(options, function(res) {
                assert.equal(res, '{Object ... }'); // will not fail assert.doesNotThrow
                done(); // call "done()" the parameter
            }, function(err) {
                if (err) throw err; // will fail the assert.doesNotThrow
                done(); // call "done()" the parameter
            });
        });
    });
});

また、署名はdoRequest(options, callback)2 つの引数を指定しますが、テストで呼び出すときは 3 つ指定します。

Mocha はおそらくメソッドを見つけることができませんでしたdoRequest(arg1,arg2,arg3)

エラー出力はありませんでしたか? モカのオプションを変更して、より多くの情報を取得できるかもしれません。

編集 :

andho の言う通り、2 番目の assert は並行してassert.doesNotThrow呼び出されますが、成功のコールバックでのみ呼び出される必要があります。

サンプルコードを修正しました。

編集2:

または、エラー処理を簡素化するには (Dan M. のコメントを参照):

describe('api', function() {
    it('should load a user', function(done) { // added "done" as parameter
        assert.doesNotThrow(function() {
            doRequest(options, function(res) {
                assert.equal(res, '{Object ... }'); // will not fail assert.doesNotThrow
                done(); // call "done()" the parameter
            }, done);
        });
    });
});
于 2012-09-25T09:46:18.183 に答える