ошибка теста react onsenui mocha «Ошибка: недопустимое состояние»

#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 или другую среду браузера для тестирования вашего кода. Это решит вашу проблему.