You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试基于Props动态修改CSS属性的useEffect钩子?

解决TextField动态padding-right的Cypress测试问题

首先,你的组件代码里有个致命错误:右侧单位<p>标签的ref被错误地设置成了inputRef,和输入框的ref冲突了,导致useEffect里unitRef.current始终是null,根本不会执行padding-right的设置逻辑。先把这个bug修复:

// 原错误代码
<p
  ref={inputRef}  // 这里错了,应该用unitRef
  ...
>

// 修复后
<p
  ref={unitRef}
  className={classNames(styles.unit, {
    [styles.unitPrimary]: type === "primary",
    [styles.unitSecondary]: type === "secondary",
    [styles.unitTernary]: type === "ternary",
  })}
  data-cy="textfield-unit"
>
  {unit}
</p>

修复组件后,再编写测试代码。因为padding-right是动态计算值(单位宽度+20px),不能断言固定数值,需要先获取单位元素的实际宽度,再计算预期的padding值:

it("should adjusts input padding based on unit width", () => {
  const onChange = () => {};
  cy.mount(
    <TextField
      ID="textfield"
      value="credium Textfield"
      onChange={onChange}
      type="primary"
      icon={<IoMdHome />}
      unit="kWh"
      rounded
      outline
    />
  );

  cy.get('[data-cy="textfield-wrapper"]').within(() => {
    // 先获取单位元素的宽度
    cy.get('[data-cy="textfield-unit"]')
      .invoke('getBoundingClientRect')
      .its('width')
      .then(unitWidth => {
        // 计算预期的padding-right值:单位宽度 + 20px
        const expectedPaddingRight = `${unitWidth + 20}px`;
        // 断言输入框的padding-right符合预期
        cy.get('input').should('have.css', 'padding-right', expectedPaddingRight);
      });
  });
});

额外说明

  • 如果你的样式文件里已经给输入框设置了基础的padding-right,要注意这里的动态设置会覆盖它,测试时要确保计算逻辑和组件一致。
  • Cypress的invoke('getBoundingClientRect')可以获取元素的实际渲染尺寸,和组件里的逻辑保持一致,保证测试准确性。

内容的提问来源于stack exchange,提问作者Ala Eddine Menai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:32