反应onsenui摩卡测试错误"错误:无效状态"

时间:2016-10-04 02:17:26

标签: reactjs mocha onsen-ui

我将react-onsenui从0.7.3更新到1.0.0后。 我用mocha来测试我的webapp。发生错误,如下所示:

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

onsenui.js'代码是这样的:

throw new Error('Invalid state');

2 个答案:

答案 0 :(得分:5)

你是如何运行摩卡测试的?我使用Mocha和JSDOM看到了这个错误。它只是众多错误中的一个,因为OnsenUI需要一个真正的浏览器环境,而JSDOM不是一个。

我的方法是在我定义DOM的browser.js文件中存根OnsenUI所需的一切。

第581行调用的代码正在寻找关键的“transitionDuration”'在window.getComputedStyle(document.documentElement, '')的结果中,以及在找不到它时的错误。我把它添加到我的browser.js文件中:

//** Polyfill for values missing from JSDOM
window.getComputedStyle = function(el1, el2) {
  return [
   "transitionDuration"
  ]
}

这解决了这个特定的错误,但还有很多。

继续阅读以获取使用OnsenUI组件运行Mocha测试的血腥细节

JSDOM window元素的属性不能用作OnsenUI的全局变量,所以我看到很多错误,如Element is not definedNode 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() {} } }

这还不足以让它运行起来。为解决与Web组件和自定义元素相关的错误,我安装了document-register-element,并将其导入测试的顶部。我还需要从https://github.com/megawac/MutationObserver.js导入MutationObserver,如下所示:

//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 :(得分:2)

由于没有真正的浏览器环境来执行这些库,因此存在很多错误。 您可以使用karma(测试运行器)来运行测试。并使用chrome / Firefox / Phantomjs / Safari或其他浏览器环境来测试您的代码。这些将解决您的问题。