测试未导出模块的节点方法

Roo*_*kee 7 javascript testing tdd unit-testing node.js

这是一个普通的节点模块.有些功能并非全部导出,但需要进行测试

var foo1 = function () { console.log("Foo1"); }
var foo2 = function () { console.log("Foo2"); }
var foo3 = function () { console.log("Foo3"); }

module.exports = {
  foo1: foo1,
  foo2: foo2
}
Run Code Online (Sandbox Code Playgroud)

谁知道如何测试foo3?通常我用node-sandboxed-module测试模块.但是只有模拟给定的东西才有可能,但是我不能改变方法的范围.

使用node-sandboxed-module测试模块的示例:

var SandboxedModule = require('sandboxed-module');
var user = SandboxedModule.require('./user', {
  requires: {'mysql': {fake: 'mysql module'}},
  globals: {myGlobal: 'variable'},
  locals: {myLocal: 'other variable'},
});
Run Code Online (Sandbox Code Playgroud)

感谢帮助!

the*_*eye 8

您无法更改该语言的范围规则.但你可以解决这个问题.您可以导出环境变量,如果该变量存在,您也可以导出foo3.像这样

module.exports = {
  foo1: foo1,
  foo2: foo2
}

if (process.env.TESTING) {
    module.exports.foo3 = foo3;
}
Run Code Online (Sandbox Code Playgroud)

因此,测试用例可以测试foo3,就像测试其他导出函数一样.但是,在生产环境中,由于TESTING环境变量不存在,foo3因此不会导出.

此外,_在函数名称中使用被理解为,函数/变量供内部使用,没有外部代码应该依赖于该函数/变量,并且它可以在没有任何通知的情况下进行更改.