您不能将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