在Node.js中覆盖其他模块中的函数

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被调用了,但是我无法弄清楚正确的方法是什么。

编辑:

为了扩展Ilya在下面的答案,以我的上面的例子为例。

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
}

这个回答解决了你的问题吗?nodejs如何在模块中覆盖一个函数 - leoschet
2个回答

3

你可能已经注意到,一个模块中声明的变量不能轻易地从另一个模块中访问。在这种情况下,通常有两种常见的方法:

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

2) 向函数传递参数

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

当您从模块调用函数时,您可以传递'request'或任何其他您需要的变量或对象。

嗨Ilya,感谢您的回答,但我不太理解第二行的语法,也不知道如何使用它来存根另一个模块中的函数。 "index = require('/routes/index')(ab);"是什么意思?我该如何在上面的示例中使用它? - Joe
好的,我在@tim-santeford的帮助下解决了问题。再次感谢,Ilya! - Joe

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%的情况下都不起作用,并且可能在未来版本的node中停止工作(这不是公共API),所以你应该仅在无法使用其他方法进行存根处理时才使用此方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接