React/Jest拖拽组件测试失败:dataTransfer数据无法获取如何解决?
解决拖拽测试中drop事件无数据的问题
你的测试失败核心原因是mock dataTransfer的方式错误,以及断言逻辑与实际代码行为不匹配,以下是具体修复方案:
问题分析
dragStart事件中,你直接将setData赋值为字符串"test",但它应该是一个能保存数据的函数drop事件未传递包含getData方法的dataTransfer对象,无法获取拖拽时设置的数据- 断言的
droppableElement.dataTransfer不存在——实际代码是通过drop事件的dataTransfer获取数据,再移动DOM元素
修复后的测试代码
import { render, screen, fireEvent } from "@testing-library/react"; import App from "./App"; test("Tests drag and drop of first component", () => { render(<App />); const draggableElement = screen.getByTestId("draggable-component"); const droppableElement = screen.getByTestId("drop-zone"); // 模拟真实dataTransfer的行为,保存拖拽数据 const mockDataTransfer = { data: {}, setData(type, value) { this.data[type] = value; }, getData(type) { return this.data[type]; } }; // 触发dragStart,传递正确的mock dataTransfer fireEvent.dragStart(draggableElement, { dataTransfer: mockDataTransfer }); // 触发drop,复用同一个mock dataTransfer以保证数据传递 fireEvent.drop(droppableElement, { dataTransfer: mockDataTransfer }); // 断言:拖拽元素已被添加到drop区域中 expect(droppableElement).toContainElement(draggableElement); // 可选:断言drop区域包含拖拽元素的文本内容 expect(droppableElement).toHaveTextContent("Drag Me to the grey component"); });
关键修改说明
- 模拟真实
dataTransfer的工作机制:用内部对象存储数据,通过setData存值、getData取值 drop事件必须传递同一个mock的dataTransfer,确保拖拽数据能在事件间传递- 调整断言逻辑:实际代码是将拖拽元素移动到drop区域,因此断言drop区域包含该元素才符合业务逻辑
内容的提问来源于stack exchange,提问作者MattBlack
相关产品推荐
相关产品推荐

