我创建了一个react 列表,用户可以通过单击按钮从其中删除项目.

删除操作如下:

 const handleRemove = (index: number) => {
   onChange(fieldName, (prevState) => {
     return {
       ...prevState,
       [fieldName]: prevState[fieldName].filter((_: any, i: number) => i !== index),
     };
   });
 };

当我手动测试它时,它工作得很好,但当我用Cypress测试它时,删除项目不能像预期的那样工作,一些项目仍然存在.(I assume)问题是,Cypress 同时按下每一个"列表删除按钮",当列表快速变化时,按索引删除项目是不可信的.在现实生活中,这不会造成任何问题,对吗?

如果可以,我应该如何重写删除逻辑?

如果这不是什么大问题,我怎么能重写我的Cypress测试来等待几毫秒,而Reaction正在处理状态更新呢?

这是我花了几个小时修修补补后想出来的:

cy.get(".fa-solid.fa-minus").each((element, index) => {
      cy.wait(index * 3).then(() => {
        element.trigger("click");
      });
});

推荐答案

each()循环是processing too fast,以允许应用程序完成每个删除操作.

内环需要一个assertion to confirm the action has completed.Cypress在执行下一次迭代之前等待该断言.

在下面的示例中,断言判断以查看列表长度是否已减小.

在没有完整示例的情况下,我使用了以下组件:

import React from 'react';
import {useState} from 'react'

const initialList = ['Cypress', 'Javascript', 'Typescript']

export const List = () => {
  const [list, setList] = useState(initialList)

  const handleRemove = (index) => {
    setList(prevState => prevState.filter((_, i) => i !== index))
  }

  return (
    <ul>
      {list.map(function(item, index) {
        return <>
          <li key={item}>{item}</li>
          <button onClick={() => handleRemove(index)}>Delete</button>
        </>
      })}
    </ul>
  )
}

这是一场考验

const itemList = ['Cypress', 'Javascript', 'Typescript']

const selector = 'button:contains("Delete this one")'

cy.get(selector)
  .each(($el, index, $list) => {
    cy.get(selector).first().click()

    // wait for action to complete

    // using list count
    cy.get(selector).should('have.length', $list.length - index -1)

    // or using item text
    cy.contains(itemList[index]).should('not.exist') 
  })

cy.get(selector).should('not.exist')       // all gone

这是通过考试的日志(log)

enter image description here

Typescript相关问答推荐

脉轮ui打字脚本强制执行图标按钮的咏叹调标签-如何关闭

角形标题大小写所有单词除外

如果一个变量不是never类型,我如何创建编译器错误?

类型脚本强制泛型类型安全

在键和值为ARGS的泛型函数中未正确推断类型

如何在LucideAngular 添加自定义图标以及如何使用它们

如何使用WebStorm调试NextJS的TypeScrip服务器端代码?

带下拉菜单的Angular 响应式选项卡

Select 下拉菜单的占位符不起作用

如何在Vue中使用Enum作为传递属性的键类型?

(TypeScript)TypeError:无法读取未定义的属性(正在读取映射)"

try 呈现应用程序获取-错误:动作必须是普通对象.使用自定义中间件进行MySQL操作

如何从一个泛型类型推断多个类型

在打字应用程序中使用Zod和Reaction-Hook-Forms时显示中断打字时出错

如何将通用接口的键正确设置为接口的键

类型脚本中参数为`T`和`t|unfined`的重载函数

类型脚本中函数重载中的类型推断问题

Route.ts文件中未导出HTTP方法

为什么类方法参数可以比接口参数窄

如何限定索引值必须与相应属性的id字段相同