Мы используем шуточные тесты с шаблоном expect(document.activeElement).toBe(myElement)
, чтобы определить, правильно ли сфокусировался элемент после взаимодействия. После обновления до jest 25 (jsdom 15) все такие тесты сломались, document.activeElement
всегда оказывается нулевым. Это также верно, если мы запустим его с помощью jsDom 16.
Команда Jest посоветовала мне открыть вопрос здесь.
import * as React from 'react';
it('should find active element', () => {
const wrapper = mount(<input />);
const inputNode = wrapper.find('input').getDOMNode();
expect(document.activeElement).not.toBe(inputNode);
inputNode.focus();
expect(document.activeElement).toBe(inputNode); // fails here with expected being null
});
Сфокусированный элемент должен быть отражен в document.activeElement
Это не соответствует шаблону выпуска; он использует недопустимый синтаксис JavaScript и ссылается на неопределенные функции.
Пожалуйста, отредактируйте сообщение, чтобы следовать шаблону задачи, создав образец, который мы можем запустить в Node.js в виде одного файла, а затем добавьте комментарий. Я также настоятельно рекомендую ссылку на jsbin или аналогичный. Тогда мы сможем вновь открыться и рассмотреть этот вопрос.
Интересно, что без энзимов все работает нормально:
https://runkit.com/wojtekmaj/jsdom-15-2-16-document-activeelement-issue-ok
Тем не менее, я думаю, что это может быть тесно связано с # 2586, который все еще является регрессом с версии 15.2:
https://runkit.com/wojtekmaj/jsdom-15-2-16-document-activeelement-issue
Связанный: энзимы/энзим#2337
Похоже, разрыв вызван растущей строгостью jsdom в отношении того, чтобы не устанавливать activeElement
для элемента вне document
. Исправление находится на стороне клиента, используя аргумент attachTo
для вызова монтирования.