【问题标题】:Overriding functions in other modules in node.js在 node.js 中覆盖其他模块中的函数
【发布时间】:2012-10-19 05:55:24
【问题描述】:

我正在尝试在 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
}

【问题讨论】:

标签: javascript node.js stub stubbing nodeunit


【解决方案1】:

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

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

2) 向函数传递参数

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

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

【讨论】:

  • 嗨,Ilya,感谢您的回答,但我并不真正理解第二行的语法,或者如何使用它来存根来自另一个模块的函数。什么是“index = require('/routes/index')(ab);”正在做?我将如何在上面的示例中使用它?
  • 好的,我在@tim-santeford 的帮助下想通了。再次感谢 Ilya!
【解决方案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),所以你应该只在它的情况下使用这种方式无法使用其他存根方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多