Cypress校验用户表格角色、状态、最近活跃列数据正确性
Cypress用户列表表格全字段断言实现方案
字段映射规则
先明确单元格索引(从2到6)和接口字段的对应计算逻辑,直接构造断言预期值:
- 索引2(姓名列):直接取接口返回的用户
name字段 - 索引3(邮箱列):直接取接口返回的用户
email字段 - 索引4(角色列):遍历用户
roles_without_context数组,提取所有项的name字段,按前端展示规则拼接(单角色直接取值,多角色用逗号加空格分隔) - 索引5(状态列):优先判断
is_invited字段,值为true时预期为Pending;非邀请状态下,存在有效current_sign_in_at值时预期为Active,无有效最近登录记录时预期为Inactive - 索引6(最近活跃列):基于接口返回的
current_sign_in_at时间戳,按前端统一的相对时间规则转换为x minutes ago/x hours ago/x days ago/x months ago格式
改造后可直接运行的测试代码
// 相对时间转换工具,规则必须和前端实现完全对齐 const formatRelativeTime = (timestamp) => { if (!timestamp) return 'Never' const now = Date.now() const timeDiff = now - new Date(timestamp).getTime() const UNIT_MINUTE = 60 * 1000 const UNIT_HOUR = 60 * UNIT_MINUTE const UNIT_DAY = 24 * UNIT_HOUR const UNIT_MONTH = 30 * UNIT_DAY if (timeDiff < UNIT_MINUTE) return 'just now' if (timeDiff < UNIT_HOUR) return `${Math.floor(timeDiff / UNIT_MINUTE)} minutes ago` if (timeDiff < UNIT_DAY) return `${Math.floor(timeDiff / UNIT_HOUR)} hours ago` if (timeDiff < UNIT_MONTH) return `${Math.floor(timeDiff / UNIT_DAY)} days ago` return `${Math.floor(timeDiff / UNIT_MONTH)} months ago` } cy.wait("@getUsers") .its("response.body.user") .then(users => { users.forEach(currentUser => { // 预计算当前用户所有待校验列的预期值,规避循环闭包问题 const columnExpected = { 2: currentUser.name.trim(), 3: currentUser.email.trim(), 4: currentUser.roles_without_context.map(roleItem => roleItem.name.trim()).join(', '), 5: (() => { if (currentUser.is_invited) return 'Pending' return currentUser.current_sign_in_at ? 'Active' : 'Inactive' })(), 6: formatRelativeTime(currentUser.current_sign_in_at).trim() } // 逐单元格校验 for (let colIndex = 2; colIndex <= 6; colIndex++) { cy.get(`.user_${currentUser.id} > :nth-child(${colIndex})`) .invoke("text") .then(cellText => { // 统一去除前后空白字符,避免前端排版空格导致断言误报 expect(cellText.trim()).to.equal(columnExpected[colIndex]) }) } }) })
落地注意事项
- 所有文本取值统一做
.trim()处理,过滤HTML缩进、换行产生的多余空白字符 - 相对时间转换规则必须和前端逻辑完全对齐,包括时间单位换算(比如月是否按30天计算)、取整规则、临界值展示文案,避免时间类断言偶发失败
- 若业务存在多角色场景,提前确认前端角色拼接的分隔符,对应调整角色字段的
join参数 - 若状态判断存在额外业务规则(比如
is_managed_externally字段影响状态展示),直接修改columnExpected[5]的计算逻辑即可 - 若最近活跃列存在“Never”这类无登录记录的展示,直接在时间转换函数中匹配对应逻辑
内容的提问来源于stack exchange,提问作者Ali Unsal Albaz
相关产品推荐
相关产品推荐

