Работа с глобальной переменной окна в 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
объект, который не является ссылкой на глобальный объект. Опции:
запустите Mocha в браузере, а не в узле. См.Мокко по документация.
установите среду узла так, чтобы она имитировала достаточно среды браузера для удовлетворения узла. Установка глобального
window
переменная, равнаяglobal
может будет достаточно, но я не знаю достаточно позвоночника, чтобы знать, будет ли позвоночник доволен этим.Запустите свой базовый код в 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) это намного быстрее, чем в браузере.