Как вы используете тесты мокко? Я видел эту ошибку, используя 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;
Есть ли какие-либо обновления по этому вопросу? В настоящее время он терпит неудачу, потому что отсутствует MutationObserver. – pietro909