Javascript 重写node.js中其他模块中的函数

Javascript 重写node.js中其他模块中的函数,javascript,node.js,stub,stubbing,nodeunit,Javascript,Node.js,Stub,Stubbing,Nodeunit,我正在尝试在Node.js应用程序中使用nodeunit存根函数。下面是我尝试做的一个简化版本: 在lib/file.js中: var request = require('request'); var myFunc = function(input, callback){ request(input, function(err, body){ callback(body); }); }; var file = require('../lib/file');

我正在尝试在Node.js应用程序中使用nodeunit存根函数。下面是我尝试做的一个简化版本:

lib/file.js
中:

var request = require('request');

var myFunc = function(input, callback){
    request(input, function(err, body){
        callback(body);
    });
};
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();
    });
};
module.exports = function(requestParam){
    return {
        myFunc: function(input, callback){
            requestParam(input, function(err, body){
                callback(body);
            });
        }
    }
}
var fakeRequestFunc = function(input, callback){
// fake request function
}

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff
}
test/test.file.js
中:

var request = require('request');

var myFunc = function(input, callback){
    request(input, function(err, body){
        callback(body);
    });
};
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();
    });
};
module.exports = function(requestParam){
    return {
        myFunc: function(input, callback){
            requestParam(input, function(err, body){
                callback(body);
            });
        }
    }
}
var fakeRequestFunc = function(input, callback){
// fake request function
}

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff
}
似乎我没有正确地覆盖
请求
,因为当我尝试运行测试时,实际的非存根
请求
被调用,但我不知道正确的方法是什么

编辑:

下面是伊利亚的回答,我举了上面的例子

lib/file/js
中:

var request = require('request');

var myFunc = function(input, callback){
    request(input, function(err, body){
        callback(body);
    });
};
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();
    });
};
module.exports = function(requestParam){
    return {
        myFunc: function(input, callback){
            requestParam(input, function(err, body){
                callback(body);
            });
        }
    }
}
var fakeRequestFunc = function(input, callback){
// fake request function
}

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff
}
然后在
test/test.file.js
中:

var request = require('request');

var myFunc = function(input, callback){
    request(input, function(err, body){
        callback(body);
    });
};
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();
    });
};
module.exports = function(requestParam){
    return {
        myFunc: function(input, callback){
            requestParam(input, function(err, body){
                callback(body);
            });
        }
    }
}
var fakeRequestFunc = function(input, callback){
// fake request function
}

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

正如您所注意到的,在一个模块中声明的变量无法从另一个模块轻松访问。在这种情况下,您有两种常见的变体:

1) 在每个模块中声明您需要的所有内容(我想不是您的情况)

2) 将参数传递给函数

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

当您从模块中调用函数时,可以将其传递为“请求”或您需要的任何其他变量或对象。

我遇到过类似的问题。探索
request
模块代码后,我的解决方案是使用
request.get
而不是代码中的
request
(执行完全相同的操作)。然后像这样将其插入测试:

也可以在nodejs中存根'require'方法的结果。检查lib/module.js上的源代码以管理如何执行此操作。应该是这样的:

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

但我不喜欢这个解决方案,因为它在100%的情况下都不起作用,并且在node的未来版本中可能会停止工作(这不是公共api),所以只有在无法使用其他存根方式的情况下,才应该使用这种方式。

嗨,伊利亚,谢谢你的回答,但我不太理解第二行的语法,或者如何使用它从另一个模块存根函数。“index=require('/routes/index')(ab);”在做什么?在上面的例子中,我将如何使用它?好的,我在@tim santeford的帮助下找到了它。再次感谢你,伊利亚!这回答了你的问题吗?