React 测试库 - 无法找到具有 data-testid 的元素

Kar*_*mar 0 reactjs react-redux react-testing-library

我正在关注 react-testing-library 的文档,以查找具有data-testid属性的元素是否已呈现。

react-testing-library 无法找到该元素,即使它存在。

测试

test('Renders step based on the active step', () => {
    render(<RenderStep />, { initialState: { implOnboard: initialState } });
  });
  expect(screen.getByTestId('step-1')).toBeDefined(); //  THROWS ERROR ?
}
Run Code Online (Sandbox Code Playgroud)

成分

 // redux
  const { activeStep } = useSelector((state) => state.implOnboard);

  const renderStep = () => {
    switch (activeStep) {
      case 1:
        console.log('Rendering this '); //  THIS IS GETTING LOGGED TOO!
        return (
          <div data-testid="step-1">
            <StepOne />
          </div>
        );
      case 2:
        return (
          <div data-testid="step-2">
            <StepTwo />
          </div>
        );
    }
  };
  return <React.Fragment>{renderStep()}</React.Fragment>;
Run Code Online (Sandbox Code Playgroud)

错误

TestingLibraryElementError: Unable to find an element by: [data-testid="step-1"]
Run Code Online (Sandbox Code Playgroud)

Lui*_*ila 45

埃琳娜的答案是错误的,只是掩盖了错误。queryByTestId如果未找到该元素,using将返回 null,而不是在 using 时返回错误getByTestId,并且断言实际上是:

  expect(null).toBeDefined();
Run Code Online (Sandbox Code Playgroud)

这一切都会过去的。这不是测试任何东西。toBeDefined()仅当该元素等于 undefined 时才会失败,并且其他所有元素都会通过。

如果OP想要实际检查该元素是否不存在,他们应该这样做:

  expect(screen.queryByTestId('step-1')).not.toBeInTheDocument();
Run Code Online (Sandbox Code Playgroud)

OP 的原始错误可能是因为预期位于测试块之外而发生。

  • 这是正确的答案。谢谢! (3认同)

San*_*ath 22

添加到 Elena 的响应中,我们需要使用queryByTestIdbecause,如果未找到元素则queryByTestId返回null值,而不是像 那样抛出错误getByTestId。下面的图片解释了何时使用不同的方法。

有时即使使用此语句也会出错queryBy,因此请在该语句之前检查其他代码。

在此输入图像描述

参考- https://www.youtube.com/watch?v=Yghw9FkNGsc&list=PL4cUxeGkcC9gm4_-5UsNmLqMosM-dzuvQ&index=5&ab_channel=TheNetNin ​​ja


小智 7

请使用queryByTestId代替getByTestId。它会起作用。

  • @ArpitGupta它实际上并没有工作,它只是忽略了错误,我控制台记录了queryByTestId,它返回了null,这意味着仍然没有找到该元素,但是这个函数不会抛出错误,而是返回null,因为测试用例正在通过。 (10认同)
  • 为什么它与 queryByTestId 一起使用而不与 getByTestId 一起使用有什么原因吗? (8认同)
  • 就像卡尚说的,这是错误的,我在回答中解释了原因 (4认同)