我正在对一个简单的Reaction组件进行组件测试,我想呈现该组件,然后对其进行一些测试. 问题是,cy.get似乎没有根据数据测试找到它.我用一个简单的div ant对其进行了测试,可以很好地找到div.我还注意到,在判断松树流道中的DOM时,没有呈现组件,但呈现了它的内容.基本上没有<MockComponent>

  it.only("renders and finds Component", () => {
    cy.mount(
      <ApolloProvider client={client}>
        <MockComponent data-testid='mock-component' {...someData} />
        <div data-testid='my-div'></div>
      </ApolloProvider>
    );

    cy.get("[data-testid='my-div']").should('exist'); //this works
    cy.get("[data-testid='mock-component']").should('exist'); //this doesn't

  });

我怎么才能拿到 cypress 的<MockComponent>,这样我就可以对它进行测试了?

推荐答案

您不能将data-id属性直接添加到Reaction组件并使其出现在DOM内容上.

设置为MockComponent的所有属性(数据或其他属性)都将作为props 传递给组件.这是react 的标准.

因此,如果您判断MockComponent内部的props,它将具有一个名为data-testid的值为mock-component的属性.

您必须在它的一个呈现元素上将其转换为MockComponent内的属性.

请注意,MockComponent从未出现在DOM中,只是呈现了子对象.

例如,明确表示:

const MockComponent = (props) => {
  return (
    <div data-testid={props["data-testid"]}>    
      <span>this is mock component</span>
    </div>
  )
}

...

cy.get("[data-testid='mock-component']")   // passes

MockComponent返回值中的<div>是呈现给DOM的"外层"元素,因此需要data-id.


或者你可以隐含地做这件事.由于someData是您的组件API的一部分,您可以将其拆分出来,并假定其余的将用作属性(而不需要实际知道它们是什么).

const MockComponent = (props) => {
  const {someData, ...rest} = props;

  const [data, setData] = useState(someData);

  return (
    <div {...rest}>
      <span>this is mock component</span>
    </div>
  )
}

...

cy.get("[data-testid='mock-component']")   // passes

另一种方法是将子元素加到MockComponent,这必须是一个实数元素.

所有子元素都作为props.children传递,您必须在返回值中呈现它们.

const MockComponent = (props) => {
  const {someData} = props

  const [data, setData] = useState(someData);

  return (
    <div>
      <span>this is mock component</span>
      {props.children}
    </div>
  )
}

...

cy.mount(
  <MockComponent {...someData} >
    <span data-testid='mock-component-child' ></span>
  </MockComponent>
);

cy.get("[data-testid='mock-component-child']")   // passes
  .parent()                              // outer element of MockComponent

Reactjs相关问答推荐

有正确的方法来设置我的金牛座应用程序的图标吗?

为什么我的标签在Redux API中不能正常工作?

在Next.js中实现动态更改的服务器组件

值在返回页面时不更新,即使我已经更新了它们

无法将react 路由状态从路由传递给子组件

在Reaction中管理多个状态

如何删除 bootstrap 手风琴上的边框

太多的重新渲染 - React 中的无限循环.如何使用React.effect并使用fetch?

单击按钮不会切换组件(当按钮和组件位于两个单独的文件中时)

尽管所有页面在 Reactjs 中都是公开的,但始终导航到特定页面

Material UI @mui/material/Button vs @material-ui/core/Button,它什么时候改变的,旧版本的文档在哪里

使用新数据更新时,React 不更新具有过滤功能的深层嵌套对象数组中的变量状态

React Final Form - 单选按钮在 FieldArray 中不起作用

如何检索包含动态段的未解析路径?

如何使用 React Router 在 React 中正确同步 useEffect 和 useLocation 挂钩?

如何通过 Material Ui 设计将 Accordion 添加到您的 React 项目中?

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性

react / firebase 基地.如何在我的项目中保存更新的数据?

material uireact ,如何从表格中删除阴影?试图找到 api 但找不到正确的属性

a.active 类在导入 x.scss 文件时有效,但在使用 x.module.scss 时无效