Работа с глобальной переменной окна в 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