3

Node.js アプリで nodeunit を使用して関数をスタブしようとしています。これが私がやろうとしていることの簡略化されたバージョンです:

lib/file.js

var request = require('request');

var myFunc = function(input, callback){
    request(input, function(err, body){
        callback(body);
    });
};

test/test.file.js

var file = require('../lib/file');

exports['test myFunc'] = function (test) {
    request = function(options, callback){
        callback('testbody');
    };

    file.myFunc('something', function(err, body){
        test.equal(body, 'testbody');
        test.done();
    });
};

requestテストを実行しようとすると、実際の非スタブが呼び出されるため、適切にオーバーライドしていないようですがrequest、それを行う正しい方法がわかりません。

編集:

上記の私の例で、以下のイリヤの答えを拡張します。

lib/file/js:

module.exports = function(requestParam){
    return {
        myFunc: function(input, callback){
            requestParam(input, function(err, body){
                callback(body);
            });
        }
    }
}

次にtest/test.file.js

var fakeRequestFunc = function(input, callback){
// fake request function
}

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff
}
4

2 に答える 2

3

お気づきのように、あるモジュールで宣言された変数は、別のモジュールから簡単にアクセスすることはできません。このような場合、2つの一般的なバリアントがあります。

1)すべてのモジュールで必要なものをすべて宣言します(あなたの場合ではないと思います)

2)パラメータを関数に渡します

var ab = "foo",
index = require('/routes/index')(ab);

モジュールから関数を呼び出すときは、「request」またはその他の必要な変数やオブジェクトを渡すことができます。

于 2012-10-19T06:04:38.013 に答える
2

同様の問題に遭遇しました。requestモジュールコードを調べた後、私のソリューションは私のコードrequest.getではなく使用requestしていました(まったく同じことを行います)。そして、次のようにテストでスタブします: https://github.com/anatoliychakkaev/resizer-app/blob/master/test/resizer.js#L25

nodejs で「require」メソッドの結果をスタブすることも可能です。lib/module.js のソースを確認して、その方法を管理してください。次のようになります。

require('module')._cache['/path/to/request.js'] = your_stub

しかし、このソリューションは 100% のケースでは機能せず、ノードの将来のバージョン (これはパブリック API ではありません) で機能しなくなる可能性があるため、私はこのソリューションが好きではありません。スタブの他の方法を使用します。

于 2012-10-19T10:45:29.590 に答える