Я тестирую свои компоненты React под jsdom, используя мой собственный крошечный "виртуальный браузер". Работает нормально, пока я не попытаюсь setState
. Например, при тестировании элемента управления вводом «детский возраст»:
describe('rendering according to the draft value', function () {
var component;
beforeEach(function () {
component = TestUtils.renderIntoDocument(
React.createElement(ChildrenInput, {value: []})
);
component.setState({draft: [{age: null}, {age: null}]}, done);
});
it('overrides the value property for the count', function () {
assert.strictEqual(component.refs.count.props.value, 2);
});
it('overrides the value property for the ages', function () {
assert.strictEqual(component.refs.age1.props.value, null);
});
});
… в строке setState
я получаю:
Неперехваченная ошибка: нарушение инварианта:опасноRenderMarkup(...): не удается отобразить разметку в рабочем потоке. Убедитесь, что window
и document
доступны глобально, прежде чем требовать React при модульном тестировании или используйте React.renderToString для рендеринга на сервере.
Я знаю, что глобальные переменные window
и document
действительно устанавливаются TestBrowser
на основе jsdom, например:
global.document = jsdom.jsdom('<html><body></body></html>', jsdom.level(1, 'core'));
global.window = global.document.parentWindow;
Я даже пытался обернуть setState
в setTimeout(..., 0)
. Это не помогает. Как я могу заставить тестирование изменений состояния работать?