【问题标题】:Testing node js module with injected dependecy使用注入依赖项测试节点 js 模块
【发布时间】:2016-10-21 07:16:29
【问题描述】:

我是java,c#程序员,有10多年经验。现在我必须用js写一些代码,真的,我感觉就像爱丽丝梦游仙境....

我有 myModule.js :

module.exports = function (logger) {
return {
    read: function (param) {
        ......
        logger.eror(....)
    },

    write: function (param) {
        ......
        logger.info(....)
    }
};

}

logger.js,(遗留代码,我无法更改)看起来很相似:

module.exports = function(some_settings){
 return {
    info: function () {
        ......
    },

    error: function () {
        ......
    }
};
}

重要的事情:记录器没有被 require("logger") 包含在 myModule 中,而是被注入到一些“全局”的 index.js 文件中,如下所示:

var settings = require("../someSettings.js")();
var logger = require("../logger.js")(settings);
var myModule = require("../myModule .js")(logger);

现在我想用 mocha 为 myModule 编写 UT。所以我想模拟记录器。而我面对墙壁。 我尝试了 proxyquire 但这不是很好的解决方案,因为记录器没有被要求包含在 myModule 中。 我尝试了 sinon 存根和模拟,例如:

var logger = require("logger.js");
var loggerMock = sinon.mock(logger);
var myModule= require("myModule.js")(loggerMock);

或者:

var logger = require("logger.js");
var loggerStub = sinon.stub(logger, "info", function() {return ....});
var myModule= require("myModule.js")(loggerStub);

但我仍然有一些错误,例如: “试图将未定义的属性错误包装为函数”...

请在这个 javascript freeky 世界中成为我的小白兔...

【问题讨论】:

    标签: javascript node.js unit-testing mocha.js sinon


    【解决方案1】:

    当您测试您的模块时,您可以为您的记录器对象使用一个假对象,即:

    const logger = {info: noop, error: noop, debug:...};
    function noop() {}
    

    如果您更喜欢以编程方式创建并使用间谍功能,也可以使用sinonjs 创建一个模拟对象

    然后,您可以注入它,将您的模块定义包装在一个闭包中(如您发布的那样):

    # myModule.js:
    
    module.exports = (dep1, dep2, ...) => {
      // module definition
    }
    

    或使用rewire 包,“注入”模块范围的依赖项(它仅适用于本地变量,不需要在您的模块中创建闭包):

    # myModuleTest    
    
    myModule = rewire('./myModule');
    myModule.__set__('logger', { /* fake logger */ });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      相关资源
      最近更新 更多