javascript私有变量未指向单元测试中的共享对象

javascript私有变量未指向单元测试中的共享对象,javascript,unit-testing,global-variables,Javascript,Unit Testing,Global Variables,我们有一个带有共享范围变量var小部件的SPA应用程序。每个模块将自己添加到共享小部件对象中,或者如果未创建小部件,则创建该小部件 使用两个框架进行单元测试,共享小部件可用,但所需文件上的变量不指向它 var WIDGET=WIDGET |{} 如果我将这行代码更改为WIDGET=WIDGET | |{},或者如果我将其全部删除,那么对象将在单元测试中按预期工作 需要知道的事情: 我们在生产中不使用nodejs,它只是用于测试 代码在生产中正确执行 测试框架一直是莫卡和玩笑 Q1在单元测试时

我们有一个带有共享范围变量var小部件的SPA应用程序。每个模块将自己添加到共享小部件对象中,或者如果未创建小部件,则创建该小部件

使用两个框架进行单元测试,共享小部件可用,但所需文件上的变量不指向它

var WIDGET=WIDGET |{}

如果我将这行代码更改为WIDGET=WIDGET | |{},或者如果我将其全部删除,那么对象将在单元测试中按预期工作

需要知道的事情:

  • 我们在生产中不使用nodejs,它只是用于测试
  • 代码在生产中正确执行
  • 测试框架一直是莫卡和玩笑
Q1在单元测试时,如何确保私有变量指向共享对象?

Q2为什么在应用程序执行期间,这种情况会发生在测试中,而不会发生在DOM中?

测试应用程序创建:
TypeError:无法读取未定义的属性“getInstance”
在新的widget_应用程序中(widgetApplication.js:23:41)
在Object.getInstance(widgetApplication.js:33:16)
在上下文中。在浏览器中,当我们在脚本中声明变量时,如下所示:

var answer = 42;
该应答变量将在定义它的脚本之后的所有脚本中全局可用

节点中的情况并非如此。当我们在一个模块中定义变量时,程序中的其他模块将无法访问该变量。那个么,为什么节点中的变量的作用域是神奇的呢

答案很简单。在编译模块之前,Node将模块代码包装到函数中,我们可以使用模块的wrapper属性对其进行检查。

多亏了

他们很容易看到node.js
require('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.