testing未导出模块的节点方法

这是一个正常的节点模块。 有些function不是全部导出,但需要testing

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

任何人都知道如何testingfoo3? 通常我用节点沙箱模块testing模块。 但是只能模拟给模块的东西,但是我不能改变方法的范围。

带有节点沙箱模块的testing模块示例:

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

感谢帮助!

您无法更改语言的范围规则。 但是你可以解决这个问题。 你可以导出一个环境variables,如果variables存在,你也可以导出foo3 。 喜欢这个

 module.exports = { foo1: foo1, foo2: foo2 } if (process.env.TESTING) { module.exports.foo3 = foo3; } 

因此,testing用例可以testingfoo3 ,就像他们testing其他导出函数一样。 但是,在生产环境中,由于TESTING环境variables不存在, foo3不会被导出。

另外,在函数名中使用_可以理解为,函数/variables是内部使用的,不需要依赖该函数/variables的外部代码,并且在没有任何通知的情况下进行更改。

我用这个,似乎工作。

sample.js

 function double(p2) { return p2*2 } module.exports = function(p, p2) { return "Hi "+p+", double "+p2+" = "+double(p2) } 

sample_test.js

 function load(file_name) { global.module = {} const contents = require('fs').readFileSync(file_name, 'utf8'); const vm = require('vm') new vm.Script(contents).runInThisContext(); } load("./sample.js") console.log(global.module.exports("Jim","10")) console.log(double(2)) 

产量

 Hi Jim, double 10 = 20 4