1. Using React Testing Library's findBy Methods to Test Asynchronous Behavior
    1m 17s

Using React Testing Library's findBy Methods to Test Asynchronous Behavior

Jamund Ferguson
InstructorJamund Ferguson
Share this video with your friends

Social Share Links

Send Tweet

You can think of waitFor as a way to delay your test until some arbitrary criteria is met. findBy on the other hand is a much more specific tool. Wait until this query resolves. The docs recommend using this tool for cases where you interact with the UI but need to wait a little bit before the changes show up on the page. Like waitFor it checks immediately and then after 50ms up until a 1000ms timeout, which is totally customizable.

The way we're using it here really isn't that optimal because it's generally going to slower than a getBy query. When I ran some tests the first query took around 70ms while the rest all took around 50ms. It might even have been better to explicitly findBy the first heading and then getBy all of the rest or even findByAll and then compare them that way.


Checkout the About Queries section of the Testing Library docs that covers the differences between getBy, findBy and queryBy. Another section called Async Methods covers all of the details around waitFor and findBy.

Instructor: Go ahead and start Jest up in watch mode, with a filter on Products.Test. Now in products.test.tsx, add a new test called Each Individual Product Should Contain A Heading. That will also take an async function.

Inside of that test, let's go ahead and renderWithContext, products. Then, below that, type for let product of myProducts, and then inside of that, await Screen.findByRole, the Role will be Heading. Then let's pass in an Options object, name of Product.Name. Go ahead and save that. You can see that it passed.

Now, this is interesting, because we already knew from before that immediately after renderWithContext, that after Products is rendered, it doesn't actually have any products. In fact, if we do const debug = renderWithContext, and execute debug here, you'll see that we don't have any products.

What's happening is, when we call findByRole instead of getByRole, findByRole with await actually waits until the heading is found. I don't know, it waits a certain number of seconds before it will time out.

It gives you that time, so we don't need to expressly call await before we can just say, "Wait until you find a heading that matches, and when you do, continue on with your test."