2016-10-04 4 views
2

После того, как я обновил response-onsenui от 0,7 до 1,0,0. Я использую mocha для проверки моего webapp. ошибка как это:Реакция onsenui mocha ошибка теста «Ошибка: недействительное состояние»

Error: Invalid state 
at /Users/*****/node_modules/onsenui/js/onsenui.js:581:11 

onsenui.js' код выглядит так:

throw new Error('Invalid state'); 

ответ

5

Как вы используете тесты мокко? Я видел эту ошибку, используя 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 компонентами

Пропертис JSDOM window элемента не были доступны как глобальные переменные для OnsenUI, так что я видел много ошибок, как Element is not defined, Node is not defined и так далее. Я решил это либо соответствие их свойства окна, если оно существует, или гася пустые функции, например:

// 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; 
+0

Есть ли какие-либо обновления по этому вопросу? В настоящее время он терпит неудачу, потому что отсутствует MutationObserver. – pietro909

2

Существует так много ошибок из-за отсутствия реальной среды браузера для выполнения этой библиотеки. Вы можете использовать карму (тестовый бегун) для запуска теста. И используйте chrome/Firefox/Phantomjs/Safari или другую среду браузера, чтобы протестировать ваш код. Это решит вашу проблему.