Работа с глобальной переменной окна в mocha js из node

Я новичок в модульном тестировании js, и я пытаюсь использовать mocha для моего учебного менеджера по контактному менеджеру, который я нашел в этом github repo. Тем не менее, у меня есть глобальная переменная window.ContactManager, которую я сначала хотел проверить, существует ли она, а затем тестировать функции 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
      });
.....

Мой тест, который не работает: var ожидать = require ('chai'). ожидать;

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

Как проверить и получить доступ к глобальной переменной окна в mocha из запуска тестов в консоли?

Ответ 1

Вы игнорируете разницу между запуском JavaScript-кода в браузере и запуском JavaScript-кода в Node.

В браузере имя window является ссылкой на объект, который содержит все ваши глобальные переменные. Поэтому, когда вы выполняете foo = 1 во внешней области, вы объявляете глобальный foo, который также доступен как window.foo. И наоборот, если вы присвоите новое поле следующим образом: window.bar = 1, вы получите новый глобальный вызов bar.

В Node к вашему глобальному объекту обращаются как global. Поэтому, если вы выполняете foo = 1 в самой внешней области, foo также доступен как global.foo. И если вы делаете global.bar = 1, у вас есть новый глобальный с именем bar.

В вашем коде показано, что вы изменяете объект window, который не является ссылкой на глобальный объект. Параметры:

  • Запустите Mocha в браузере вместо Node. См. Документация Mocha.

  • Установите среду Node, чтобы она имитировала достаточную среду браузера для удовлетворения Node. Установка глобальной переменной window равным global может быть достаточно, но я не знаю, что Магистраль достаточно, чтобы знать, будет ли Backbone довольна этим.

  • Запустите свой базовый код в jsdom. Jsdom предоставляет реалистичные window и document, как если бы ваш код работал в браузере, но он имеет свои пределы. Я не знаю, будет ли Backbone довольна этими ограничениями.

Ответ 2

Другим решением было бы использовать 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