Javascript 重写node.js中其他模块中的函数
我正在尝试在Node.js应用程序中使用nodeunit存根函数。下面是我尝试做的一个简化版本: 在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');
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的帮助下找到了它。再次感谢你,伊利亚!这回答了你的问题吗?