93

I'm writing some tests for a React app using Testing Library. I want to check that some text appears, but I need to check it appears in a particular place because I know it already appears somewhere else.

The Testing Library documentation for queries says that the getByText query takes a container parameter, which I guessed lets you search within that container. I tried doing this, with the container and text parameters in the order specified in the docs:

const container = getByTestId('my-test-id');
expect(getByText(container, 'some text')).toBeTruthy();

and I get an error: matcher.test is not a function.

If I put the params the other way round:

const container = getByTestId('my-test-id');
expect(getByText('some text', container)).toBeTruthy();

I get a different error: Found multiple elements with the text: some text

Which means it's not searching inside the specified container.

I think I'm not understanding how getByText works. What am I doing wrong?

1
  • You can grab the text with expect(container.textContent).toMatch('some text') Commented May 3, 2023 at 14:45

3 Answers 3

99

Better to use within for this sort of things:

render(<MyComponent />)
const { getByText } = within(screen.getByTestId('my-test-id'))
expect(getByText('some text')).toBeInTheDocument()
Sign up to request clarification or add additional context in comments.

8 Comments

Following up the is s solution as getByText throw out error if text cannt find. Then what is the point to use expect....toBeInTheDocument?
@carmine-tambascia, do you have a link to that quote in the docs? I can't seem to find it.
@carmine-tambascia Thank you. Seems it's just a tip for the sake of the developer, though, and nothing more.
@carmine-tambascia Also, those are not the React Testing Library docs. The docs can be found here.
|
90

Another way to do this

import {render, screen} from '@testing-library/react';

...

  render(<MyComponent />);
  expect(screen.getByTestId('my-test-id')).toHaveTextContent('some text');

Note it is now recommended to use screen instead of the results of render.

(StackOverflow post the points to a KC Dobbs Article explaining why: react-testing-library - Screen vs Render queries)

5 Comments

You may need to add import "@testing-library/jest-dom/extend-expect"; to access the toHaveTextContent matcher as described here.
"...recommended to use screen..." But y tho? Rather than pontificating, a link by Those Who Recommend would be appreciated.
Heres another SO post on screen vs render that points to a KC Dobbs explination: stackoverflow.com/questions/61482418/…
Unfortunately on toHaveTextContent I got ' Property 'toHaveTextContent' does not exist on type 'HTMLElement''
Seems like a much better solution than the accepted answer, which forces a particular coding style.
11

This way you can be more precise, focusing in specific item:

expect(queryByTestId("helperText")?.textContent).toContain("Help me!");

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.