使用 react-dnd 和 useDrag 和 useDrop 进行测试

Posted

技术标签:

【中文标题】使用 react-dnd 和 useDrag 和 useDrop 进行测试【英文标题】:Tests using react-dnd with useDrag and useDrop 【发布时间】:2020-01-19 12:30:21 【问题描述】:

有没有人能够使用带有 useDrag 和 useDrop 钩子的功能组件测试来自 https://github.com/react-dnd/react-dnd 的拖放功能?

根据在此处找到的示例http://react-dnd.github.io/react-dnd/docs/testing,它们要么使用 DragSource 或 DropTarget HOC 装饰原始组件。 例如:

// ...

export interface BoxProps 
    name: string

    // Collected Props
    isDragging: boolean
    connectDragSource: ConnectDragSource

const Box: React.FC<BoxProps> = ( name, isDragging, connectDragSource ) => 
    const opacity = isDragging ? 0.4 : 1
    return (
        <div ref=connectDragSource style= ...style, opacity >
            name
        </div>
    )


export default DragSource(
    ItemTypes.BOX,
    
        beginDrag: (props: BoxProps) => ( name: props.name ),
        endDrag(props: BoxProps, monitor: DragSourceMonitor) 
            const item = monitor.getItem()
            const dropResult = monitor.getDropResult()

            if (dropResult) 
                alert(`You dropped $item.name into $dropResult.name!`)
            
        ,
    ,
    (connect: DragSourceConnector, monitor: DragSourceMonitor) => (
        connectDragSource: connect.dragSource(),
        isDragging: monitor.isDragging(),
    ),
)(Box)

示例取自https://github.com/react-dnd/react-dnd/blob/master/packages/documentation/examples-decorators/src/01-dustbin/single-target/Box.tsx

我找不到任何使用他们的钩子进行测试的例子。他们确实有使用装饰器和挂钩的代码示例 (https://github.com/react-dnd/react-dnd/tree/master/packages/documentation),但也有仅使用装饰器的测试示例。

【问题讨论】:

你找到解决办法了吗,我正在尝试用这种方式解决排序 并非如此。他们承认他们的 API 需要解决这个问题:github.com/react-dnd/react-dnd/issues/1540 【参考方案1】:

我从 github 票上复制了这个并为我工作:

const dragAndDrop = (src: Element, dst: Element) => 
  fireEvent.dragStart(src);
  fireEvent.dragEnter(dst);
  fireEvent.drop(dst);
  fireEvent.dragLeave(dst);
  fireEvent.dragEnd(src);
 ;
const allSections = rendered.getAllByRole('dropzone');

const marketSection = allSections[0];
const marketExpandedSection = allSections[1];

const basisIdDrag = within(marketSection).getByRole('draggable');

act(() => 
  dragAndDrop(basisIdDrag, marketExpandedSection);
);

【讨论】:

以上是关于使用 react-dnd 和 useDrag 和 useDrop 进行测试的主要内容,如果未能解决你的问题,请参考以下文章

antd的表格拖拽

使用 ReactJs 和 react-dnd 拖放可排序列表的问题

react-dnd使用介绍

看不到我使用 React-dnd 拖动的项目

react-dnd 拖拽

react-dnd 的 connectDragPreview() 是如何工作的?