javascript - 测试套件无法运行。 Invariant Violation : _registerComponent(. ..): 目标容器不是 DOM 元素

标签 javascript html reactjs jestjs

我正在尝试测试我的 React 组件的渲染,但出现以下错误: 不变违规:_registerComponent(...):目标容器不是 DOM 元素。 如果我更改以下在 document.body 上呈现我的组件的位置,则错误不存在,如果这个位置是一些 div,body 中有一些 id,则错误存在。

这里是我的组件:

import React, {Component} from 'react';
{render} from 'react-dom';
import Demo from './demo/demo'
import Demo2 from  './demo2/demo2'
require('./app-styles.sass')

export class App extends Component {
render() {
    return (
           <div>
               <Demo2 />
               <Demo />
               <div>Hello jest from react</div>
           </div>
       );
   }
}
render(<App/>, document.getElementById('helloWorldRoot'));

该组件的测试:

import React from 'react'
import {shallow, mount} from 'enzyme'
import {App} from './app'

describe('base component', () => {
  it('renders as a div', () => {
    const application = shallow(<App />);
    expect(application).toMatchSnapshot();
  });
});

这是我的 html:

    <!DOCTYPE html>
    <html>
    <head>
      <title>Hello jests' tests</title>
      <link rel="stylesheet" href="dist/app.css">
    </head>

    <body>
      <div id="helloWorldRoot"></div>
      <script type="text/javascript" src="dist/app.js"></script>
    </body>

这里有什么问题? 我很乐意提供一些建议。

最佳答案

您正在测试的文件,app.js , 正在尝试查找 ID 为 helloWorldRoot 的 DOM 元素在最后一行。当 Enzyme 呈现该元素时,此 DOM 元素不存在 - 因此出现错误消息。

要解决此问题,请将 <App /> 分开组件并将其渲染成两个文件。确保将应用程序挂载到 DOM 的文件(我们称它为 main.js )只做这件事而不做其他事情。另一个文件,app.js ,然后可以使用 Jest 和 Enzyme 进行测试。

所以 main.js 应该做的不超过:

import React from 'react';
import { render } from 'react-dom';
import App from './app';

render(<App/>, document.getElementById('helloWorldRoot'));

当然,相应的行应该从 app.js 中删除.

关于javascript - 测试套件无法运行。 Invariant Violation : _registerComponent(. ..): 目标容器不是 DOM 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590183/

相关文章:

javascript - JQuery - 仅当两个连续轮询不具有相同状态时才增加 div 标记中的计数器

css - jQuery Mobile 布局自定义

javascript - 使用语义 ui 时 react 选择宽度问题

javascript - Jquery 宽度不调整大小

javascript - 如何使用 AngularJS 动态获取文本框值

javascript - 光标 :pointer not working on input type file

html - 使用缩进和对齐将文本环绕在图像周围

node.js - Reactjs + Electron + Nodejs

javascript - 使用 [dnd-multi-backend] 或 [TouchBackend]+[HTML5Backend]+[Modernizr] 的触摸屏自定义拖动预览?

javascript - 我应该如何将数据绑定(bind)到附加元素到转换后的 D3.js 组?