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

非必填字段测试用例执行失败,请求排查问题原因

问题:InputField必填项测试失败原因及解决方法

我有一个子输入组件InputField,想要编写测试用例验证输入框是否为必填项,但在执行expect(fieldNotRequired).toBeFalsy();这一行时测试失败。请问问题出在哪里?

测试代码如下:

test("Form Field Input", () => {
  render(
    <FieldTestWrapper>
      <InputField
        name={"required"}
        label={"required"}
        type={"text"}
        data-test-id="required"
        required
      />
      <InputField
        name={"not-required"}
        label={"not-required"}
        type={"text"}
        data-test-id="not-required"
      />
    </FieldTestWrapper>
  );

  const fieldRequired = screen.getByTestId("required");
  const fieldNotRequired = screen.getByTestId("not-required");

  expect(fieldRequired).toBeInTheDocument();
  expect(fieldNotRequired).toBeInTheDocument();

  expect(fieldRequired).toBeTruthy();
  expect(fieldNotRequired).toBeFalsy();
});

问题原因

你犯了逻辑错误:screen.getByTestId返回的是DOM元素对象,只要元素渲染到页面上,这个对象就永远是truthy值(即使没有required属性)。所以expect(fieldNotRequired).toBeFalsy()必然失败,因为这个输入框元素本身是存在的。

你要验证的是输入框是否带有required属性,而不是元素是否存在。

修正后的测试代码

使用Testing Library的toHaveAttribute匹配器来检查属性是否存在:

test("Form Field Input", () => {
  render(
    <FieldTestWrapper>
      <InputField
        name={"required"}
        label={"required"}
        type={"text"}
        data-test-id="required"
        required
      />
      <InputField
        name={"not-required"}
        label={"not-required"}
        type={"text"}
        data-test-id="not-required"
      />
    </FieldTestWrapper>
  );

  const fieldRequired = screen.getByTestId("required");
  const fieldNotRequired = screen.getByTestId("not-required");

  expect(fieldRequired).toBeInTheDocument();
  expect(fieldNotRequired).toBeInTheDocument();

  // 验证必填项存在required属性
  expect(fieldRequired).toHaveAttribute('required');
  // 验证非必填项不存在required属性
  expect(fieldNotRequired).not.toHaveAttribute('required');
});

或者也可以直接检查DOM元素的required属性值:

expect(fieldRequired.required).toBe(true);
expect(fieldNotRequired.required).toBe(false);

两种方式都能正确验证输入框的必填状态,避免了之前的逻辑错误。


内容的提问来源于stack exchange,提问作者ReactDeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:30:43