javascript - 如何在 Jest 测试中模拟影子元素

标签 javascript reactjs jestjs shadow-dom jsdom

我有一个 React 组件 ReactComponentContainer,它获取配置和 shadowRoot

import React from 'react';
import App from './App';
import ReactComponent from './ReactComponent';

const ReactComponentContainer = function({config, shadowRoot}) {

  configme(shadowRoot.host || shadowRoot);

  return (
    <App renderRoot={shadowRoot}>
      <ReactComponent/>
    </App>
  );
};

export default ReactComponentContainer;

在我的 jest 测试文件中,我需要模拟一个 shadow dom,所以我可以将其作为参数传递给 ReactComponentContainer。

const header = document.createElement('header');
const shadowRoot = header.attachShadow({mode: 'open'});
shadowRoot.innerHTML = '<h1>Hello Shadow DOM</h1>';
import React from 'react';
import ReactComponentContainer from './ReactComponentContainer';

describe('ReactComponentContainer', () => {
  beforeEach(() => {
    setUp = (props) => {
      return mount(<ReactComponentContainer {...props} />);
    };
  });

  it('initailize ReactComponentContainer', () => {

    // mock a shadow dom
    const header = document.createElement('header');
    // Error: attachShadow is undefined
    const shadowRoot = header.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = '<h1>Hello Shadow DOM</h1>';

    const props = {
      config: {},
      renderRoot: shadowRoot
    };

    const element = setUp(props);
  });
});

我收到错误:attachShadow 未定义。我想是因为它只是浏览器。

我的问题:

如何模拟 shadow dom,以便在 jest 测试中运行它?

最佳答案

我用这篇文章解决了我在 Svelte 中的 shadowRoot 测试问题。 所有函数都放在一个单独的 CrudTableService.js 中。

为了使用 jest 运行单元测试并捕获影子 DOM 以提高代码覆盖率,我找到了这个解决方案:

it('testSetDeleteMode', async () => {
        const documentHTML = '<!doctype html><html><body>' +
            '<crud-table>' +.     // added for shadow DOM test
            '<div id="options-default"></div>' +
            '<div id="options-delete"></div>' +
            '</crud-table>' +     // added for shadow DOM test
            '</body></html>';
        document.body.innerHTML = documentHTML  // for light DOM tests

        // create shadow DOM for customElement
        const crudTable = document.querySelector('crud-table');
        const shadowRoot = crudTable.attachShadow({mode: 'open'});
        shadowRoot.innerHTML = documentHTML;

关于javascript - 如何在 Jest 测试中模拟影子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693620/

相关文章:

javascript - ReactJS 兄弟组件之间的通信

reactjs - 如何在 ASP.NET Core 3 React 应用程序的 index.html 中从服务器注入(inject)数据

jestjs - Eslint开 Jest/全局环境 key 未知

unit-testing - 如何使用 Jest 仅模拟一个测试文件的模块?

javascript - 可通过 Javascript 和 Php 访问的存储?

javascript - jquery-ui 自动完成,操作 json 和 javascript 来解析隐藏的输入字段?

javascript - Firestore 特定数据读取不适用于变量,但适用于静态值

javascript - 在跟随鼠标指针的图像上制作轴引导线

reactjs - 如何从深层嵌套子组件调用方法

javascript - 在 React 中使用 jest.fn() 模拟获取