测试具有注入依赖性的节点js模块

时间:2016-10-21 07:16:30

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

我是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 () {
        ......
    }
};
}

重要的是:记录器不包含在myModule中的require(“logger”),而是注入了一些“global”index.js文件,如下所示:

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

现在我想在mocha中为myModule编写UT。所以我想模拟记录器。我面对着墙。 我尝试了proxyquire,但这不是很好的解决方案,因为logM不包含在myModule中。 我试过sinon stub并模仿,例如:

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世界中成为我的白兔......

1 个答案:

答案 0 :(得分:0)

在测试模块时,可以使用假对象作为记录器对象,即:

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

或者使用sinonjs创建模拟对象,如果您更喜欢以编程方式创建它并使用间谍功能。

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

# myModule.js:

module.exports = (dep1, dep2, ...) => {
  // module definition
}

或者使用rewire包来“注入”模块范围的依赖项(它仅适用于local-vars,而不需要在模块中创建闭包):

# myModuleTest    

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