javascript私有变量未指向单元测试中的共享对象
我们有一个带有共享范围变量var小部件的SPA应用程序。每个模块将自己添加到共享小部件对象中,或者如果未创建小部件,则创建该小部件 使用两个框架进行单元测试,共享小部件可用,但所需文件上的变量不指向它 var WIDGET=WIDGET |{} 如果我将这行代码更改为WIDGET=WIDGET | |{},或者如果我将其全部删除,那么对象将在单元测试中按预期工作 需要知道的事情:javascript私有变量未指向单元测试中的共享对象,javascript,unit-testing,global-variables,Javascript,Unit Testing,Global Variables,我们有一个带有共享范围变量var小部件的SPA应用程序。每个模块将自己添加到共享小部件对象中,或者如果未创建小部件,则创建该小部件 使用两个框架进行单元测试,共享小部件可用,但所需文件上的变量不指向它 var WIDGET=WIDGET |{} 如果我将这行代码更改为WIDGET=WIDGET | |{},或者如果我将其全部删除,那么对象将在单元测试中按预期工作 需要知道的事情: 我们在生产中不使用nodejs,它只是用于测试 代码在生产中正确执行 测试框架一直是莫卡和玩笑 Q1在单元测试时
- 我们在生产中不使用nodejs,它只是用于测试
- 代码在生产中正确执行
- 测试框架一直是莫卡和玩笑
测试应用程序创建:
TypeError:无法读取未定义的属性“getInstance”
在新的widget_应用程序中(widgetApplication.js:23:41)
在Object.getInstance(widgetApplication.js:33:16)
在上下文中。在浏览器中,当我们在脚本中声明变量时,如下所示:
var answer = 42;
该应答变量将在定义它的脚本之后的所有脚本中全局可用
节点中的情况并非如此。当我们在一个模块中定义变量时,程序中的其他模块将无法访问该变量。那个么,为什么节点中的变量的作用域是神奇的呢
答案很简单。在编译模块之前,Node将模块代码包装到函数中,我们可以使用模块的wrapper属性对其进行检查。多亏了
他们很容易看到node.jsrequire('module')
将模块包装在函数()中
这帮助我认识到我需要将模块压缩到一个文件中进行测试。然后需要('minifiedModules')
在我的单元测试中,代码如下所示
var _Widget_ = require('minifiedModules');
var app;
test('verify _Widget_',function(){
//testing with jest
expect(_Widget_.widgetLogger).toBeDefined();
expect(_Widget_.smallApplication).toBeDefined();
});
test('instantiate app',function(){
app = _Widget_.smallApplication.getInstance();
});
test('run app',function(){
app.runApplication();
});
现在运行npm测试就可以了
> jest
PASS ./app.test.js
√ _WIDGET_ objects (34ms)
√ instantiate app (5ms)
√ run app (5ms)
console.log app.test.js:23
Widget objects { widgetLogger: { getInstance: [Function: getInstance] },
smallApplication: { getInstance: [Function: getInstance] } }
console.log test/scripts/services/services.min.js:87
get instance was called
console.log test/scripts/services/services.min.js:71
make the instance
console.log test/scripts/services/services.min.js:78
no way this works, _WIDGET_, { widgetLogger: { getInstance: [Function: getInstance] },
smallApplication: { getInstance: [Function: getInstance] } }
console.log test/scripts/services/services.min.js:97
widget application runs - will call logger
console.log test/scripts/services/services.min.js:30
widget logger called to stage log
console.log test/scripts/services/services.min.js:40
widget logger staged this log { widgetProgramCode: 'smallApplication',
widgetVersion: '1.0.2.0',
startTime: 2018-10-30T03:41:10.815Z }
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 2.067s
Ran all test suites.
var answer = 42;
var _Widget_ = require('minifiedModules');
var app;
test('verify _Widget_',function(){
//testing with jest
expect(_Widget_.widgetLogger).toBeDefined();
expect(_Widget_.smallApplication).toBeDefined();
});
test('instantiate app',function(){
app = _Widget_.smallApplication.getInstance();
});
test('run app',function(){
app.runApplication();
});
> jest
PASS ./app.test.js
√ _WIDGET_ objects (34ms)
√ instantiate app (5ms)
√ run app (5ms)
console.log app.test.js:23
Widget objects { widgetLogger: { getInstance: [Function: getInstance] },
smallApplication: { getInstance: [Function: getInstance] } }
console.log test/scripts/services/services.min.js:87
get instance was called
console.log test/scripts/services/services.min.js:71
make the instance
console.log test/scripts/services/services.min.js:78
no way this works, _WIDGET_, { widgetLogger: { getInstance: [Function: getInstance] },
smallApplication: { getInstance: [Function: getInstance] } }
console.log test/scripts/services/services.min.js:97
widget application runs - will call logger
console.log test/scripts/services/services.min.js:30
widget logger called to stage log
console.log test/scripts/services/services.min.js:40
widget logger staged this log { widgetProgramCode: 'smallApplication',
widgetVersion: '1.0.2.0',
startTime: 2018-10-30T03:41:10.815Z }
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 2.067s
Ran all test suites.