使用 react-testing-library 时找不到带有文本的元素:“myText”错误

Posted

技术标签:

【中文标题】使用 react-testing-library 时找不到带有文本的元素:“myText”错误【英文标题】:Unable to find an element with the text: "myText" error when using react-testing-library 【发布时间】:2019-07-02 18:03:10 【问题描述】:

我正在尝试将 react-testing-library 与 React 和 Jest 一起使用,但我的一个测试失败了,我认为这与测试文件中 className prop 上的正则表达式有关。

下面我附上了各自的测试和组件文件。

另外,有没有办法snapshot 使用这个库进行测试?我觉得我的测试由于某种原因没有完成。

// Image.js Component


// @flow
import * as React from "react";
import styled from "styled-components";

const StyledImage = styled.img`
  max-width: $props => props.imageWidth || 100%;
`;

type Props = 
  imageAlt: string,
  imageSrc: string | boolean | Function,
  className?: string,
  StyledImage: React.Element<typeof StyledImage>
;

const Image = (props: Props) => 
  const  imageAlt, imageSrc, className  = props;
  return (
    <StyledImage
      ...props
      className=className
      src=imageSrc
      alt=imageAlt
    />
  );
;

export default Image;



// Image.test.js 


import React from "react";
import  render, cleanup  from "react-testing-library";
import Image from "../Image";

describe("<Image /> component", () => 
  afterEach(cleanup);

  describe("Component as a whole", () => 
    it("renders the image with a src, alt and a className ", () => 
      const testProps = 
        imageAlt: "some random string",
        imageSrc: "" /* [ASK]: How to test this */,
        className: "imageDescripton" /* [ASK]: How to test this */
      ;

      const  getByAltText  = render(<Image ...testProps />);
      const  getByText  = render(<Image ...testProps />);

      const imageAltNode = getByAltText(testProps.imageAlt);
      const imageClassNameNode = getByText(`$testProps.className`); // [FAIL]: Fails with error.  Unable to find an element with the text: imageDescripton. Regex problem?

      expect(imageAltNode).toBeDefined();
      expect(imageClassNameNode).toBeDefined();
    );
  );
);

完整的错误日志

Unable to find an element with the text: imageDescripton. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

<body>
  <div>
    <img
      
      class="imageDescripton Image__StyledImage-sc-1icad3x-0 judnkv"
      src=""
    />
  </div>
  <div>
    <img
      
      class="imageDescripton Image__StyledImage-sc-1icad3x-0 judnkv"
      src=""
    />
  </div>
</body>

  18 |
  19 |       const imageAltNode = getByAltText(testProps.imageAlt);
> 20 |       const imageClassNameNode = getByText(`$testProps.className`); // [FAIL]: Fails with error.  Unable to find an element with the text: imageDescripton. Regex problem?
     |                                  ^
  21 |
  22 |       expect(imageAltNode).toBeDefined();
  23 |       expect(imageClassNameNode).toBeDefined();

【问题讨论】:

【参考方案1】:

getByText 在节点内查找文本。所以在这个例子中:

<div class="foo">bar</div>

文字是bar

getByAltText 是查找图像的最佳方式。另一种方法是使用getByTestId

如果您必须按类查找元素怎么办?在这些情况下,您可以使用由render 返回的containercontainer 只是一个 DOM 节点,所以你可以这样做

const  container  = render(<MyComponent />)
container.querySelector('.my-class')

请注意,您不必使用toBeDefined(),您可以使用更习惯用法的toBeInTheDocument()。确保先安装jest-dom


如何制作快照?同样,您可以使用container。在这种情况下,您需要第一个孩子。

expect(container.firstChild).toMatchSnapshot()

【讨论】:

以上是关于使用 react-testing-library 时找不到带有文本的元素:“myText”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Testing-Library 测试 mapDispatchToProps?

如何使用 Jest 和 react-testing-library 测试 useRef?

react-testing-library - 屏幕与渲染查询

如何使用 react-testing-library 测试由其他组件组成的组件?

使用 react-testing-library 时如何测试组件是不是使用正确的道具呈现?

使用 react-testing-library 时找不到带有文本的元素:“myText”错误