我是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世界中成为我的白兔......
答案 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 */ });