backbone.js 从节点使用mocha js中的全局窗口变量

prdp8dxp  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(160)

我是js单元测试的新手,我正在尝试使用mocha作为我在this github repo中找到的 Backbone.js 联系人管理器教程。但是,我有一个全局的window.ContactManager变量,我首先想测试它是否存在,然后测试start函数中的router.on功能。该变量看起来如下:

window.ContactManager = {
  Models: {},
  Collections: {},
  Views: {},

  start: function(data) {
    var contacts = new ContactManager.Collections.Contacts(data.contacts),
        router = new ContactManager.Router();

    router.on('route:home', function() {
      router.navigate('contacts', {
        trigger: true,
        replace: true
      });
    });

    router.on('route:showContacts', function() {
      var contactsView = new ContactManager.Views.Contacts({
        collection: contacts
      });
.....

我的测试不起作用:如果您有一个请求,那么您可以使用以下命令:

describe("Application", function() {
    it('creates a global variable for the name space ContactManager' , function () {
        expect(ContactManager).to.exist;
    })
});

如何通过在控制台中运行测试来测试和访问mocha中的全局窗口变量?

lkaoscv7

lkaoscv71#

您忽略了在浏览器中运行JavaScript代码与在Node中运行JavaScript代码之间的区别。
在浏览器中,window名称是对包含所有全局变量的对象的引用。因此,当你在最外层作用域中执行foo = 1时,你声明了一个全局foo,它也可以作为window.foo访问。相反,如果你像这样分配一个新字段:window.bar = 1,则会有一个新的全局变量bar
在Node中,全局对象是以global的形式访问的,所以如果你在最外层的作用域中执行foo = 1foo也可以以global.foo的形式访问,如果你执行global.bar = 1,你就有了一个新的全局对象bar
您的代码显示您修改了一个window对象,该对象似乎不是对全局对象的引用。选项:
1.在浏览器中运行Mocha,而不是在节点中运行。请参阅Mocha的文档。
1.设置你的节点环境,使它模仿足够的浏览器环境来满足节点。设置一个全局变量window等于global * 可能 * 就足够了,但我不知道Backbone是否会满意。
1.在jsdom中运行基于Backbone的代码。Jsdom提供了逼真的windowdocument,就像代码在浏览器中运行一样,但是它有它的限制。我不知道Backbone是否会对这些限制感到满意。

2g32fytz

2g32fytz2#

另一种解决方案是使用https://www.npmjs.com/package/window-or-global

import React, { Component } from 'react'
// in node, you'll get the global object instead of crashing by an error 
import root from 'window-or-global'

class MyComponent extends Component {

  // this method is only invoked in the browser environment 
  componentDidMount() {
    root.addEventListener(/*...*/)
  }

  componentWillUnmount() {
    root.addEventListener(/*...*/)
  }

  render() {}

}

// Voilà. Enjoy your universal react component! ;) 
// No more 'window is not defined' errors when you render your component 
// on server side.

若要安装,请执行npm install --save window-or-global
在服务器上运行测试(例如使用mocha-webpack)比在浏览器中运行要快得多。

相关问题