#reactjs #mocha.js #onsen-ui
#reactjs #mocha.js #onsen-ui
Вопрос:
После того, как я обновлю react-onsenui с 0.7.3 до 1.0.0. Я использую mocha для тестирования своего веб-приложения. ошибка произошла следующим образом:
Error: Invalid state
at /Users/*****/node_modules/onsenui/js/onsenui.js:581:11
onsenui.js » код выглядит следующим образом:
throw new Error('Invalid state');
Ответ №1:
Как вы выполняете свои тесты Mocha? Я видел эту ошибку, используя Mocha с JSDOM. Это всего лишь одна из многих ошибок, возникающих из-за того, что OnsenUI ожидает реальную среду браузера, а JSDOM таковой не является.
Мой подход заключался в том, чтобы заглушить все, что нужно OnsenUI в browser.js файл, в котором я определяю свой DOM.
Код, вызываемый в строке 581, ищет ключ ‘transitionDuration’ в результатах window.getComputedStyle(document.documentElement, '')
и выдает ошибки, когда он его не находит. Я добавил это в свой browser.js файл:
//** Polyfill for values missing from JSDOM
window.getComputedStyle = function(el1, el2) {
return [
"transitionDuration"
]
}
Это устранило эту конкретную ошибку, но их было намного больше.
Читайте дальше, чтобы узнать подробности о том, как запустить тесты Mocha с компонентами OnsenUI
Свойства window
элемента JSDOM не были доступны в качестве глобальных переменных для OnsenUI, поэтому я видел много ошибок, таких как Element is not defined
, Node is not defined
и так далее. Я решил их, либо сопоставив их со свойством window, если оно существовало, либо отключив пустые функции, например:
// browser.js
global['Element'] = window.Element;
global['HTMLElement'] = window.HTMLElement;
global['WebComponents'] = function() {};
global['Node'] = window.Node;
global['Window'] = window;
global['Viewport'] = function() { return { setup: function() {} } }
Этого все еще было недостаточно, чтобы запустить его. Чтобы устранить ошибки, связанные с веб-компонентами и пользовательскими элементами, я установил document-register-element
и импортировал его в начале своих тестов. Мне также нужно было импортировать сервер MutationObserver из https://github.com/megawac/MutationObserver.js , вот так:
//shims.js
import './shims/mutationobserver';
global['MutationObserver'] = window.MutationObserver;
В итоге мои тестовые файлы выглядят так:
import 'babel-polyfill'
import React from 'react';
import { mount, shallow } from 'enzyme';
import {expect} from 'chai';
import document from './helpers/browser';
import './helpers/shims';
import 'document-register-element';
import Frame from '../react-app/components/frame';
describe('<Frame />', function () {
it('renders without problems', function () {
var wrapper = shallow(<Frame />);
expect(wrapper.find('iframe')).to.have.length(1);
});
});
Вот полный текст browser.js
:
import { jsdom } from 'jsdom';
//** Create a fake DOM to add the tests to
const document = jsdom('<!doctype html><html><body></body></html>');
const window = document.defaultView;
//** Push the window object properties to the Mocha global object- no idea why it doesn't work for all of the properties
Object.keys(window).forEach((key) => {
if (!(key in global)) {
global[key] = window[key];
}
});
//** These ones need to be done manually
global['Element'] = window.Element;
global['HTMLElement'] = window.HTMLElement;
global['WebComponents'] = function() {};
global['Node'] = window.Node;
global['Window'] = window;
global['Viewport'] = function() { return { setup: function() {} } }
//** Polyfill for values missing from JSDOM
window.getComputedStyle = function(el1, el2) {
return [
"transitionDuration"
]
}
global.document = document;
global.window = window;
Комментарии:
1. есть ли какие-либо обновления по этому вопросу? В настоящее время происходит сбой, потому что отсутствует «MutationObserver».
Ответ №2:
Существует так много ошибок из-за того, что нет реальной среды браузера для выполнения этих библиотек. Вы можете использовать karma (тестовый бегун) для запуска вашего теста. И используйте chrome / Firefox / Phantomjs / Safari или другую среду браузера для тестирования вашего кода. Это решит вашу проблему.