Я тестирую свои компоненты 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.renderToString для рендеринга сервера.
Я знаю, что window
и document
глобальные значения действительно устанавливаются на основе jsdom TestBrowser
, например:
global.document = jsdom.jsdom('<html><body></body></html>', jsdom.level(1, 'core'));
global.window = global.document.parentWindow;
Я даже пытался обернуть setState
в setTimeout(..., 0)
. Это не помогает. Как я могу провести тестирование изменений состояния?