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

Я новичок в модульном тестировании js, и я пытаюсь использовать mocha для моего учебника по менеджеру контактов, который я нашел в этот GitHub РЕПО. Однако у меня есть глобальное окно.Переменная ContactManager, что я firsted хотел проверить, существует ли он, а затем проверить маршрутизатор.о функциональности внутри функции start позже. Переменная выглядит так:

  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 expect = require ('chai').ожидайте;

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

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

2 ответов


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

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

В Узел, ваш глобальный объект доступен как global. Так что если вы делаете foo = 1 в самой дальней области,foo работает в качестве global.foo. И если вы это сделаете global.bar = 1, у вас есть новый глобальный с именем bar.

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

  1. запустите Mocha в браузере, а не в узле. См.Мокко по документация.

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

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


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

запуск тестов на сервере (например с мокко-webpack) это намного быстрее, чем в браузере.