我决定创建一个简单的井字游戏来练习测试,但是在我写的第一个测试之后,我得到了这个恼人的行为警告。我的代码不是异步的,所以我不知道如何解决它。
下面是组件代码:
const Board = () => {
const [currentSign,setCurrentSign] = useState<"cross" | "circle">("cross")
const [board, setBoard] = useState (new Array(9).fill(null))
const handleUserClick = (e:React.MouseEvent<HTMLDivElement>) => {
// @ts-ignore
if (board[e.target.dataset.number] !==null) return
// @ts-ignore
// @ts-ignore
setBoard(p=>p.map((el,i)=>i===+e.target.dataset.number?currentSign:el))
setCurrentSign(p=>p==="cross"?"circle":"cross")
}
return (
<div onClick={handleUserClick} data-testid="board" className="board">
{new Array(9).fill(null).map((_,i)=>(
<div key={i} data-number={i} data-testid="board-child" className={
`board-child
${board[i] === null ? "" : board[i] === "cross" ? "cross" : "circle"}`}/>
))}
</div>
);
};
下面是测试:
test("when user clicks second time, the clicked element gets 'circle' class", async () => {
render(<Board />);
const boardChildren = screen.getAllByTestId("board-child");
await user.click(boardChildren[0]);
await user.click(boardChildren[1]);
expect(boardChildren[1]).toHaveClass("circle");
});
测试通过,但留下行为警告
1条答案
按热度按时间enxuqcxy1#
好吧,结果是RTL内部错误,解决方案是将RTL更新到最新(v14)版本。