为什么用 Jest 测试 Vue 组件时 document.activeElement 没有指向 JSDom 中的焦点元素?

Why does document.activeElement not point to the focused element in JSDom when testing a Vue component with Jest?

我正在使用 vue-test-utilsjest 测试 Vue.js 2 组件。该组件自动将焦点设置到特定元素。 JSDom 应该指向 document.activeElement 变量中的这个元素,但即使我在测试中使用 wrapper.find(...).element.focus() 手动设置焦点,它也只会指向 body 元素。

it('focuses the default option automatically', async () => {
  const wrapper = await mount(component);
  console.log(document.activeElement); // -> <body></body>
  // expect(document.activeElement.value).toBe('none');
});

当您使用 vue-test-utils 挂载组件时,它不会自动连接到 JSDom。您需要使用 mount() / shallowMount() 函数的 attachTo 选项连接它。

const wrapper = await mount(component, {
  attachTo: document.body, // ← added!
});

最终提示我的是 enzymejs 存储库中的这个问题:https://github.com/enzymejs/enzyme/issues/2337#issuecomment-586583502

此外,关于焦点,特定版本的 JSDom(v16 对我来说工作正常)存在问题,在某些情况下,tabindex 属性是必需的:https://github.com/jsdom/jsdom/issues/2586