react testing library waitfor timeout

one of the assertions do end up failing. Like the waitFor, it has a default timeout of one second. If that is not the case, The right approach is to use the userEvent API, which replicates user interaction with more fidelity. Launching the CI/CD and R Collectives and community editing features for how to test if component rerenders after state change for react hooks testing library. Swap this with your UI // framework of choice const div = document. Most framework-implementations of Testing Library provide a number one recommended approach to query your component's output. I don't think we're quite there yet and this is why it's not So, maybe the issue resides in its usage? The phrasing of that always confused me, but I now understand. Effects created using useEffect or useLayoutEffect are also not run on server rendered hooks until hydrate is called. The way I fixed this issue was to force re-render the component. have a function you can call which does not throw an error if no element is This method is essentially a shortcut for console.log(prettyDOM()). This library encourages your applications to be more accessible and allows you This is the async version of getBy. Can non-Muslims ride the Haramain high-speed train in Saudi Arabia? this goal, you want your tests to avoid including implementation details of your when a real user uses it. v4. The React code is somewhat like this: Where ChildComponent mounts, it fetches some data and then re-renders itself with the hydrated data. We want to ensure that your users can interact with your UI and if you query findAllByText<. I hear about this is that it leads to content writers breaking your tests. the first argument. Wrappers such as This also worked for me :). This could be because the text is broken up by multiple elements. can contain options that affect the precision of string matching: Before running any matching logic against text in the DOM, DOM Testing Library components. Let's say that for the example above, window.fetch was called twice. To learn more, see our tips on writing great answers. I had an issue similar to this when I was setting up testing for a test application. The name wrapper is old cruft from enzyme and we don't need that here. type screen. Advice: Install and use the ESLint plugin for . Based on the Guiding Principles, your test should the library works with any framework. findBy queries can be used Use a testid if fuzzy matching and should be preferred over. The text was updated successfully, but these errors were encountered: Try adding an interval on the waitFor call: The default behaviour is to only test when the hook triggers a rerender via a state update. Thanks! Finding form elements by their See the docs for each There are several async events in the UI, like fetching data and displaying a new page on click of button. @thymikee yes, I had reviewed #397 as well in hopes of finding an answer. Well slightly modify our test to use Jest fake timers. Running jest.runOnlyPendingTimers() or jest.runAllTimers() doesn't help? Okay it looks like the general approach followed by wait-for-expect to capture the global timer funcs before they get mocked works, but it has highlighted a problem with the 'modern' timer mocks which is caused partially by the 'react-native' preset polyfilling global.promise and partially by the new timer mocks mocking process.nextTick. By default, normalization consists of The user event library provides a series of tools for programmatically interacting with a webpage during a test. Have a question about this project? It seems that just this change (await waitFor(() => { -> waitFor(() => {) fixes your legacy-timers.test.js. You can learn more about this from my blog post (and be silenced, but it's actually telling you that something unexpected is queryBy methods dont throw an error when no element is found. However, it doesn't return its own waitFor util, so you'll have to use the one you can import from @testing-library/react instead. These can be useful to wait for an element to appear or disappear in response to an event, user action, timeout, or Promise. If we must target more than one . Hi, I'm writing a test that validates that my custom hook logs an error when fetch returns an error status code. html, and get visual feedback matching the rules mentioned above. Thanks a lot! better. implementation but not functionality) don't break your tests and slow you and unable to find an element with the role you've specified, not only will we log Well occasionally send you account related emails. Despite our efforts to document the "better way" If you're using Jest's Timer Mocks, remember not to use async/await syntax as it will stall your tests. here. If my current test case is invalid, I can seek out creating a more realistic test case. How does the NLT translate in Romans 8:2? The text was updated successfully, but these errors were encountered: Not sure if I understood your issues correctly. In order to properly use helpers for async tests ( findBy queries and waitFor ) you need at least React >=16.9.0 (featuring async act ) or React Native >=0.61 (which comes with React >=16.9.0). I am definitely not intimately familiar with Babel and how it works. EDIT: Increasing the wait time is still causing the same error. The If you To learn more, see our tips on writing great answers. This could be, // because the text is broken up by multiple elements. react-hooks-testing-library version: 7.0.0; react version: 17.0.2; react-dom version: 17.0.2; node version: 14.16.0; npm version: 7.10.0; Problem. Think about it this way: when something happens in a test, for instance, a button is clicked, React needs to call the . Most of the query APIs take a TextMatch as an argument, which means the I've battled with await and waitFor() (RTL's built-in API for waiting for stuff to happen) a lot recently. Browse other questions tagged, Where developers & technologists share private knowledge with coworkers, Reach developers & technologists worldwide, Well that may mean that the element is not present. resemble how users interact with your code (component, page, etc.) For simplicity, we will not add any of those effects. (but not all) of the built-in normalization behavior: For convenience screen also exposes a debug method in addition to the queries. In addition, if you just However the type call, will trigger keyDown, keyPress, and keyUp events Sign in This worked for me! or is rejected in a given timeout (one second by default). TextMatch for documentation on what can be passed to a query. By clicking Sign up for GitHub, you agree to our terms of service and As the name suggests it will just render the component. Returns a future with a single element value with the given role value, defaulting to an exact match after waiting 1000ms (or the provided timeout duration).. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. Any assistance you are wiling to provide is appreciated. given that this library is intended to be used with a JSC/Hermes app, I would think testing in that environment would be ideal for this library, We may adjust our Babel config for testing to reflect that, PRs welcome :). If it weren't for your answer I'd be down the same rabbit hole. All of the queries exported by DOM Testing Library accept a container as the If there is a specific condition you want to wait for other than the DOM node being on the page, wrap a non-async query like getByText or queryByText in a . Learn more. Appearance and Disappearance. In the example above, Waiting for appearance . For me, it was jest-cli that had an old version of jsdom. Thanks for contributing an answer to Stack Overflow! Based on the docs I don't understand in which case to use act and in which case to use waitFor. in a browser. Adding module:metro-react-native-babel-preset to the RNTL repository causes the tests to begin to fail as I have outlined in my original post. specific element, you can use within. The wait utilities retry until the query passes or times out. Testing Library also exports a screen object which has every query that is As part of this, you want your testbase to be I've written most of the code for the first bit but to make it work with modern timers we need to patch a line in '@jest/fake-timers'. Additionally, we add instructions to active and de-active the fake timers,jest.useFakeTimers and jest.useRealTimers, respectively. >. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. Testing with puppeteer an AWS amplify react app, Can't find named elements with react-native-testing-library, Not placing waitFor statement before findBy cause test to fail - React Testing Library, React-testing-library: getByTestId() or queryByTestId() not working, thros Unable to find an element by data-testid. Why was the nose gear of Concorde located so far aft? // Without screen, you need to provide a container: // substring match, ignore case, searches for "hello world" or "hello orld", // case-sensitive regex with different case. In this case your code would look something like: I hope this works for you. This library has a peerDependencies listing for react-test-renderer and, of course, react. throw before the assertion has a chance to). Package versions: The async methods return Promises, so be sure to use await or .then when calling them. Already on GitHub? While the fireEvent API, can be used to issue DOM events, its NOT the recommended method for testing user interaction as it doesnt reflect how the user really interacts with the DOM. future). It appears that when using module:metro-react-native-babel-preset regenerator is used to manage the async work. you can call getDefaultNormalizer to obtain a built-in normalizer, either to One does not even need to invoke waitFor for tests in the given file to fail. // provide a function for your text matcher to make your matcher more flexible. The RNTL repository babel.config.js does not include module:metro-react-native-babel-preset. It would be a shame if something were to . Advice: use find* any time you want to query for something that may not be Returns a list of elements with the given text content, defaulting to an exact match after waiting 1000ms (or the provided timeout duration). The default timeout is 1000ms which will keep you under Jest's default timeout of 5000ms. possible. very helpful. Queries are the methods that Testing Library gives you to find elements on the However, given that this library is intended to be used with a JSC/Hermes app, I would think testing in that environment would be ideal for this library. If you're using jest, with great examples. user-event to fire events and simulate user interactions This API has been previously named container for compatibility with React Testing Library. recent versions, the *ByRole queries have been seriously improved (primarily Well occasionally send you account related emails. components and rather focus on making your tests give you the confidence for It looks like you've put a lot of work into that Web app you've got there. getBy query methods fail when there is no matching element. I could understand if waitFor and timer mocks were fundamentally incompatible, but I wanted to seek out if that is the case. How did Dominion legally obtain text messages from Fox News hosts? React doesnt rerender component if already rendered once, fireEvent is calling Found multiple elements by: data-testid error in react-testing-library, React Testing Library: Match Number of Buttons, React Testing Library: Simple routing test error, Testing react-lazyload in React testing library. It provides light utility functions on top of react-dom and react-dom/test-utils, in a way that encourages better testing practices. If you need to wait for an element to appear, the async wait utilities allow you to wait for an assertion to be satisfied before proceeding. The second step is to separate the component from the actual hook implementation. 6. what page content you are selecting, different queries may be more or less Do you still have problems knowing how to use Testing Library queries? screen and then after that you can take your snapshot. function in the options object. Programmatically navigate using React router. Events API or TL;DR If you find yourself using act () with RTL (react-testing-library), you should see if RTL async utilities could be used instead: waitFor , waitForElementToBeRemoved or findBy . Kent C. Dodds is a JavaScript software engineer and teacher. As time has gone on, we've made some small changes to the API and we've Ok, so I know why it isn't working. It's much closer to the user's actual interactions. Most of the time, if you're seeing an act warning, it's not just something to Async APIs like Do you know why module:metro-react-native-babel-preset is not a part of the RNTL repository? screen.debug When using React Testing Library, use async utils like waitFor and findBy.. Async example - data fetching effect in useEffect. The React Testing Library is a very light-weight solution for testing React For debugging using testing-playground, screen much better. with confidence. note. @testing-library/jest-dom**. We just need to set the delay option to null so that user-event does not wait on setTimeout. within functionality). need to, high: definitely listen to this advice! We would like to verify the text disappears after first pressing the button. Copyright 2018-2023 Kent C. Dodds and contributors. Just hit this problem now as I was migrating our app to RN 0.63. React Testing Library's waitFor not working, React Testing Library - using 'await wait()' after fireEvent, testing-library.com/docs/guide-disappearance/#2-using-waitfor, https://testing-library.com/docs/react-testing-library/api/#rerender, The open-source game engine youve been waiting for: Godot (Ep. Sign up for a free GitHub account to open an issue and contact its maintainers and the community. This approach provides you with more confidence that the application works . It It is particularly odd that enabling "modern" timers will break a test file if you merely import waitFor. To find only elements that are children of a querying the DOM in the same way the user would. There is an alternate form of test that fixes this. So another one of my favorite features of the *ByRole queries is that if we're 1000), removing the fake timers and just letting the waitForNextUpdate do it's thing allows the test to pass (albeit after a second of waiting . And make sure you didn't miss rather old but still relevant Kent C. Dodds' Common mistakes with React Testing . PTIJ Should we be afraid of Artificial Intelligence? label text (just like a user would), finding links and buttons from their text This also means that you can't use snapshot assertions within waitFor. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. already included as a dependency. In addition, this works fine if I use the waitFor from @testing-library/react instead. If you'd like to avoid several of these common mistakes, then the official ESLint plugins could help out a lot: eslint-plugin-testing-library. discovered suboptimal patterns. What you said about not awaiting the return of waitFor when using fake timers makes sense. Kent's taught hundreds Async waits in React Testing Library. @mpeyper Thanks! Connect and share knowledge within a single location that is structured and easy to search. How to properly visualize the change of variance of a bivariate Gaussian distribution cut sliced along a fixed variable? encouraging good testing practices. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. They often have The async method waitFor is helpful when you need to wait for an async response of some kind in your test. @thymikee no, running jest.runOnlyPendingTimers() or jest.runAllTimers() does not appear to fix the issue. Or they use custom promise implementation? react-dom/test-utils, in a way that encourages better testing practices. data-testid as an "escape hatch" for elements where the text content and label @thymikee no, running jest.runOnlyPendingTimers() or jest.runAllTimers() does not appear to fix the issue. The problem is that the test will complete as soon as fetchData completes, before ever calling the callback. explicit. I found the answer here: React Testing Library - using 'await wait()' after fireEvent. In this post, you learned about the React Testing Library asynchronous testing function of waitFor. supports debugging the document, a single element, or an array of elements. What has meta-philosophy to say about the (presumably) philosophical work of non professional philosophers? The goal of the library is to help you write tests in a way similar to how the user would use the application. 'waits for element until it stops throwing', // Async action ends after 300ms and we only waited 100ms, so we need to wait, // for the remaining async actions to finish, //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndhaXRGb3IudGVzdC5qcyJdLCJuYW1lcyI6WyJCYW5hbmEiLCJSZWFjdCIsIkNvbXBvbmVudCIsInByb3BzIiwib25DaGFuZ2VGcmVzaCIsInJlbmRlciIsImZyZXNoIiwiY2hhbmdlRnJlc2giLCJCYW5hbmFDb250YWluZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJzZXRTdGF0ZSIsInN0YXRlIiwiYWZ0ZXJFYWNoIiwiamVzdCIsInVzZVJlYWxUaW1lcnMiLCJ0ZXN0IiwiZ2V0QnlUZXh0IiwicXVlcnlCeVRleHQiLCJmaXJlRXZlbnQiLCJwcmVzcyIsImV4cGVjdCIsInRvQmVOdWxsIiwiZnJlc2hCYW5hbmFUZXh0IiwiY2hpbGRyZW4iLCJ0b0JlIiwidGltZW91dCIsInJlamVjdHMiLCJ0b1Rocm93IiwibW9ja0ZuIiwiZm4iLCJFcnJvciIsImludGVydmFsIiwiZSIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsInVzZUZha2VUaW1lcnMiLCJhZHZhbmNlVGltZXJzQnlUaW1lIl0sIm1hcHBpbmdzIjoiOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxNQUFOLFNBQXFCQyxlQUFNQyxTQUEzQixDQUEwQztBQUFBO0FBQUE7O0FBQUEseUNBQzFCLE1BQU07QUFDbEIsV0FBS0MsS0FBTCxDQUFXQyxhQUFYO0FBQ0QsS0FIdUM7QUFBQTs7QUFLeENDLEVBQUFBLE1BQU0sR0FBRztBQUNQLHdCQUNFLDZCQUFDLGlCQUFELFFBQ0csS0FBS0YsS0FBTCxDQUFXRyxLQUFYLGlCQUFvQiw2QkFBQyxpQkFBRCxnQkFEdkIsZUFFRSw2QkFBQyw2QkFBRDtBQUFrQixNQUFBLE9BQU8sRUFBRSxLQUFLQztBQUFoQyxvQkFDRSw2QkFBQyxpQkFBRCw0QkFERixDQUZGLENBREY7QUFRRDs7QUFkdUM7O0FBaUIxQyxNQUFNQyxlQUFOLFNBQThCUCxlQUFNQyxTQUFwQyxDQUF1RDtBQUFBO0FBQUE7O0FBQUEsbUNBQzdDO0FBQUVJLE1B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Q0FDVjtBQUNEOztBQUNEbkIsRUFBQUEsSUFBSSxDQUFDc0IsbUJBQUwsQ0FBeUIsR0FBekI7QUFFQWYsRUFBQUEsTUFBTSxDQUFDUSxNQUFELENBQU4sQ0FBZUsscUJBQWYsQ0FBcUMsQ0FBckM7QUFDRCxDQWZHLENBQUo7QUFpQkFsQixJQUFJLENBQUMsd0JBQUQsRUFBMkIsWUFBWTtBQUN6Q0YsRUFBQUEsSUFBSSxDQUFDcUIsYUFBTCxDQUFtQixRQUFuQjtBQUVBLFFBQU1OLE1BQU0sR0FBR2YsSUFBSSxDQUFDZ0IsRUFBTCxDQUFRLE1BQU07QUFDM0IsVUFBTUMsS0FBSyxDQUFDLE1BQUQsQ0FBWDtBQUNELEdBRmMsQ0FBZjs7QUFJQSxNQUFJO0FBQ0YsbUJBQVEsTUFBTUYsTUFBTSxFQUFwQixFQUF3QjtBQUFFSCxNQUFBQSxPQUFPLEVBQUUsR0FBWDtBQUFnQk0sTUFBQUEsUUFBUSxFQUFFO0FBQTFCLEtBQXhCO0FBQ0QsR0FGRCxDQUVFLE9BQU9DLENBQVAsRUFBVSxDQUNWO0FBQ0Q7O0FBQ0RuQixFQUFBQSxJQUFJLENBQUNzQixtQkFBTCxDQUF5QixHQUF6QjtBQUVBZixFQUFBQSxNQUFNLENBQUNRLE1BQUQsQ0FBTixDQUFlSyxxQkFBZixDQUFxQyxDQUFyQztBQUNELENBZkcsQ0FBSiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVmlldywgVGV4dCwgVG91Y2hhYmxlT3BhY2l0eSB9IGZyb20gJ3JlYWN0LW5hdGl2ZSc7XG5pbXBvcnQgeyByZW5kZXIsIGZpcmVFdmVudCwgd2FpdEZvciB9IGZyb20gJy4uJztcblxuY2xhc3MgQmFuYW5hIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueT4ge1xuICBjaGFuZ2VGcmVzaCA9ICgpID0+IHtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlRnJlc2goKTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3PlxuICAgICAgICB7dGhpcy5wcm9wcy5mcmVzaCAmJiA8VGV4dD5GcmVzaDwvVGV4dD59XG4gICAgICAgIDxUb3VjaGFibGVPcGFjaXR5IG9uUHJlc3M9e3RoaXMuY2hhbmdlRnJlc2h9PlxuICAgICAgICAgIDxUZXh0PkNoYW5nZSBmcmVzaG5lc3MhPC9UZXh0PlxuICAgICAgICA8L1RvdWNoYWJsZU9wYWNpdHk+XG4gICAgICA8L1ZpZXc+XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBCYW5hbmFDb250YWluZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8e30sIGFueT4ge1xuICBzdGF0ZSA9IHsgZnJlc2g6IGZhbHNlIH07XG5cbiAgb25DaGFuZ2VGcmVzaCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDApKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgZnJlc2g6IHRydWUgfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8QmFuYW5hIG9uQ2hhbmdlRnJlc2g9e3RoaXMub25DaGFuZ2VGcmVzaH0gZnJlc2g9e3RoaXMuc3RhdGUuZnJlc2h9IC8+XG4gICAgKTtcbiAgfVxufVxuXG5hZnRlckVhY2goKCkgPT4ge1xuICBqZXN0LnVzZVJlYWxUaW1lcnMoKTtcbn0pO1xuXG50ZXN0KCd3YWl0cyBmb3IgZWxlbWVudCB1bnRpbCBpdCBzdG9wcyB0aHJvd2luZycsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgeyBnZXRCeVRleHQsIHF1ZXJ5QnlUZXh0IH0gPSByZW5kZXIoPEJhbmFuYUNvbnRhaW5lciAvPik7XG5cbiAgZmlyZUV2ZW50LnByZXNzKGdldEJ5VGV4dCgnQ2hhbmdlIGZyZXNobmVzcyEnKSk7XG5cbiAgZXhwZWN0KHF1ZXJ5QnlUZXh0KCdGcmVzaCcpKS50b0JlTnVsbCgpO1xuXG4gIGNvbnN0IGZyZXNoQmFuYW5hVGV4dCA9IGF3YWl0IHdhaXRGb3IoKCkgPT4gZ2V0QnlUZXh0KCdGcmVzaCcpKTtcblxuICBleHBlY3QoZnJlc2hCYW5hbmFUZXh0LnByb3BzLmNoaWxkcmVuKS50b0JlKCdGcmVzaCcpO1xufSk7XG5cbnRlc3QoJ3dhaXRzIGZvciBlbGVtZW50IHVudGlsIHRpbWVvdXQgaXMgbWV0JywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCB7IGdldEJ5VGV4dCB9ID0gcmVuZGVyKDxCYW5hbmFDb250YWluZXIgLz4pO1xuXG4gIGZpcmVFdmVudC5wcmVzcyhnZXRCeVRleHQoJ0NoYW5nZSBmcmVzaG5lc3MhJykpO1xuXG4gIGF3YWl0IGV4cGVjdChcbiAgICB3YWl0Rm9yKCgpID0+IGdldEJ5VGV4dCgnRnJlc2gnKSwgeyB0aW1lb3V0OiAxMDAgfSlcbiAgKS5yZWplY3RzLnRvVGhyb3coKTtcblxuICAvLyBBc3luYyBhY3Rpb24gZW5kcyBhZnRlciAzMDBtcyBhbmQgd2Ugb25seSB3YWl0ZWQgMTAwbXMsIHNvIHdlIG5lZWQgdG8gd2FpdFxuICAvLyBmb3IgdGhlIHJlbWFpbmluZyBhc3luYyBhY3Rpb25zIHRvIGZpbmlzaFxuICBhd2FpdCB3YWl0Rm9yKCgpID0+IGdldEJ5VGV4dCgnRnJlc2gnKSk7XG59KTtcblxudGVzdCgnd2FpdHMgZm9yIGVsZW1lbnQgd2l0aCBjdXN0b20gaW50ZXJ2YWwnLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IG1vY2tGbiA9IGplc3QuZm4oKCkgPT4ge1xuICAgIHRocm93IEVycm9yKCd0ZXN0Jyk7XG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiBtb2NrRm4oKSwgeyB0aW1lb3V0OiA0MDAsIGludGVydmFsOiAyMDAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBzdXBwcmVzc1xuICB9XG5cbiAgZXhwZWN0KG1vY2tGbikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xufSk7XG5cbnRlc3QoJ3dvcmtzIHdpdGggbGVnYWN5IGZha2UgdGltZXJzJywgYXN5bmMgKCkgPT4ge1xuICBqZXN0LnVzZUZha2VUaW1lcnMoJ2xlZ2FjeScpO1xuXG4gIGNvbnN0IG1vY2tGbiA9IGplc3QuZm4oKCkgPT4ge1xuICAgIHRocm93IEVycm9yKCd0ZXN0Jyk7XG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgd2FpdEZvcigoKSA9PiBtb2NrRm4oKSwgeyB0aW1lb3V0OiA0MDAsIGludGVydmFsOiAyMDAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBzdXBwcmVzc1xuICB9XG4gIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSg0MDApO1xuXG4gIGV4cGVjdChtb2NrRm4pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygzKTtcbn0pO1xuXG50ZXN0KCd3b3JrcyB3aXRoIGZha2UgdGltZXJzJywgYXN5bmMgKCkgPT4ge1xuICBqZXN0LnVzZUZha2VUaW1lcnMoJ21vZGVybicpO1xuXG4gIGNvbnN0IG1vY2tGbiA9IGplc3QuZm4oKCkgPT4ge1xuICAgIHRocm93IEVycm9yKCd0ZXN0Jyk7XG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgd2FpdEZvcigoKSA9PiBtb2NrRm4oKSwgeyB0aW1lb3V0OiA0MDAsIGludGVydmFsOiAyMDAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBzdXBwcmVzc1xuICB9XG4gIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSg0MDApO1xuXG4gIGV4cGVjdChtb2NrRm4pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygzKTtcbn0pO1xuIl19, "@babel/runtime/helpers/interopRequireDefault", "@babel/runtime/helpers/assertThisInitialized", "@babel/runtime/helpers/possibleConstructorReturn", //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndhaXRGb3IudGVzdC5qcyJdLCJuYW1lcyI6WyJCYW5hbmEiLCJwcm9wcyIsIm9uQ2hhbmdlRnJlc2giLCJmcmVzaCIsImNoYW5nZUZyZXNoIiwiUmVhY3QiLCJDb21wb25lbnQiLCJCYW5hbmFDb250YWluZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJzZXRTdGF0ZSIsInN0YXRlIiwiYWZ0ZXJFYWNoIiwiamVzdCIsInVzZVJlYWxUaW1lcnMiLCJ0ZXN0IiwiZ2V0QnlUZXh0IiwicXVlcnlCeVRleHQiLCJmaXJlRXZlbnQiLCJwcmVzcyIsImV4cGVjdCIsInRvQmVOdWxsIiwiZnJlc2hCYW5hbmFUZXh0IiwiY2hpbGRyZW4iLCJ0b0JlIiwidGltZW91dCIsInJlamVjdHMiLCJ0b1Rocm93IiwibW9ja0ZuIiwiZm4iLCJFcnJvciIsImludGVydmFsIiwidG9IYXZlQmVlbkNhbGxlZFRpbWVzIiwidXNlRmFrZVRpbWVycyIsImUiLCJhZHZhbmNlVGltZXJzQnlUaW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0lBRU1BLE07Ozs7Ozs7Ozs7Ozs7Ozs4RkFDVSxZQUFNO0FBQ2xCLFlBQUtDLEtBQUwsQ0FBV0MsYUFBWDtBQUNELEs7Ozs7Ozs2QkFFUTtBQUNQLGFBQ0UsNkJBQUMsaUJBQUQsUUFDRyxLQUFLRCxLQUFMLENBQVdFLEtBQVgsSUFBb0IsNkJBQUMsaUJBQUQsZ0JBRHZCLEVBRUUsNkJBQUMsNkJBQUQ7QUFBa0IsUUFBQSxPQUFPLEVBQUUsS0FBS0M7QUFBaEMsU0FDRSw2QkFBQyxpQkFBRCw0QkFERixDQUZGLENBREY7QUFRRDs7O0VBZGtCQyxlQUFNQyxTOztJQWlCckJDLGU7Ozs7Ozs7Ozs7Ozs7Ozt5RkFDSTtBQUFFSixNQUFBQSxLQUFLLEVBQUU7QUFBVCxLO2lHQUVRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdEQUNSLElBQUlLLE9BQUosQ0FBWSxVQUFDQyxPQUFEO0FBQUEsdUJBQWFDLFVBQVUsQ0FBQ0QsT0FBRCxFQUFVLEdBQVYsQ0FBdkI7QUFBQSxlQUFaLENBRFE7O0FBQUE7QUFFZCxxQkFBS0UsUUFBTCxDQUFjO0FBQUVSLGdCQUFBQSxLQUFLLEVBQUU7QUFBVCxlQUFkOztBQUZjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEs7Ozs7Ozs2QkFLUDtBQUNQLGFBQ0UsNkJBQUMsTUFBRDtBQUFRLFFBQUEsYUFBYSxFQUFFLEtBQUtELGFBQTVCO0FBQTJDLFFBQUEsS0FBSyxFQUFFLEtBQUtVLEtBQUwsQ0FBV1Q7QUFBN0QsUUFERjtBQUdEOzs7RUFaMkJFLGVBQU1DLFM7O0FBZXBDTyxTQUFTLENBQUMsWUFBTTtBQUNkQyxFQUFBQSxJQUFJLENBQUNDLGFBQUw7QUFDRCxDQUZRLENBQVQ7QUFJQUMsSUFBSSxDQUFDLDJDQUFELEVBQThDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFDYixjQUFPLDZCQUFDLGVBQUQsT0FBUCxDQURhLEVBQ3hDQyxTQUR3QyxXQUN4Q0EsU0FEd0MsRUFDN0JDLFdBRDZCLFdBQzdCQSxXQUQ2Qjs7QUFHaERDLHNCQUFVQyxLQUFWLENBQWdCSCxTQUFTLENBQUMsbUJBQUQsQ0FBekI7O0FBRUFJLFVBQUFBLE1BQU0sQ0FBQ0gsV0FBVyxDQUFDLE9BQUQsQ0FBWixDQUFOLENBQTZCSSxRQUE3QjtBQUxnRDtBQUFBLDRDQU9sQixlQUFRO0FBQUEsbUJBQU1MLFNBQVMsQ0FBQyxPQUFELENBQWY7QUFBQSxXQUFSLENBUGtCOztBQUFBO0FBTzFDTSxVQUFBQSxlQVAwQztBQVNoREYsVUFBQUEsTUFBTSxDQUFDRSxlQUFlLENBQUN0QixLQUFoQixDQUFzQnVCLFFBQXZCLENBQU4sQ0FBdUNDLElBQXZDLENBQTRDLE9BQTVDOztBQVRnRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxDQUE5QyxDQUFKO0FBWUFULElBQUksQ0FBQyx3Q0FBRCxFQUEyQztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQ3ZCLGNBQU8sNkJBQUMsZUFBRCxPQUFQLENBRHVCLEVBQ3JDQyxTQURxQyxZQUNyQ0EsU0FEcUM7O0FBRzdDRSxzQkFBVUMsS0FBVixDQUFnQkgsU0FBUyxDQUFDLG1CQUFELENBQXpCOztBQUg2QztBQUFBLDRDQUt2Q0ksTUFBTSxDQUNWLGVBQVE7QUFBQSxtQkFBTUosU0FBUyxDQUFDLE9BQUQsQ0FBZjtBQUFBLFdBQVIsRUFBa0M7QUFBRVMsWUFBQUEsT0FBTyxFQUFFO0FBQVgsV0FBbEMsQ0FEVSxDQUFOLENBRUpDLE9BRkksQ0FFSUMsT0FGSixFQUx1Qzs7QUFBQTtBQUFBO0FBQUEsNENBV3ZDLGVBQVE7QUFBQSxtQkFBTVgsU0FBUyxDQUFDLE9BQUQsQ0FBZjtBQUFBLFdBQVIsQ0FYdUM7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FBM0MsQ0FBSjtBQWNBRCxJQUFJLENBQUMsd0NBQUQsRUFBMkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ3ZDYSxVQUFBQSxNQUR1QyxHQUM5QmYsSUFBSSxDQUFDZ0IsRUFBTCxDQUFRLFlBQU07QUFDM0Isa0JBQU1DLEtBQUssQ0FBQyxNQUFELENBQVg7QUFDRCxXQUZjLENBRDhCO0FBQUE7QUFBQTtBQUFBLDRDQU1yQyxlQUFRO0FBQUEsbUJBQU1GLE1BQU0sRUFBWjtBQUFBLFdBQVIsRUFBd0I7QUFBRUgsWUFBQUEsT0FBTyxFQUFFLEdBQVg7QUFBZ0JNLFlBQUFBLFFBQVEsRUFBRTtBQUExQixXQUF4QixDQU5xQzs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBVzdDWCxVQUFBQSxNQUFNLENBQUNRLE1BQUQsQ0FBTixDQUFlSSxxQkFBZixDQUFxQyxDQUFyQzs7QUFYNkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQ0FBM0MsQ0FBSjtBQWNBakIsSUFBSSxDQUFDLCtCQUFELEVBQWtDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNwQ0YsVUFBQUEsSUFBSSxDQUFDb0IsYUFBTCxDQUFtQixRQUFuQjtBQUVNTCxVQUFBQSxNQUg4QixHQUdyQmYsSUFBSSxDQUFDZ0IsRUFBTCxDQUFRLFlBQU07QUFDM0Isa0JBQU1DLEtBQUssQ0FBQyxNQUFELENBQVg7QUFDRCxXQUZjLENBSHFCOztBQU9wQyxjQUFJO0FBQ0YsMkJBQVE7QUFBQSxxQkFBTUYsTUFBTSxFQUFaO0FBQUEsYUFBUixFQUF3QjtBQUFFSCxjQUFBQSxPQUFPLEVBQUUsR0FBWDtBQUFnQk0sY0FBQUEsUUFBUSxFQUFFO0FBQTFCLGFBQXhCO0FBQ0QsV0FGRCxDQUVFLE9BQU9HLENBQVAsRUFBVSxDQUVYOztBQUNEckIsVUFBQUEsSUFBSSxDQUFDc0IsbUJBQUwsQ0FBeUIsR0FBekI7QUFFQWYsVUFBQUEsTUFBTSxDQUFDUSxNQUFELENBQU4sQ0FBZUkscUJBQWYsQ0FBcUMsQ0FBckM7O0FBZG9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBQWxDLENBQUo7QUFpQkFqQixJQUFJLENBQUMsd0JBQUQsRUFBMkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQzdCRixVQUFBQSxJQUFJLENBQUNvQixhQUFMLENBQW1CLFFBQW5CO0FBRU1MLFVBQUFBLE1BSHVCLEdBR2RmLElBQUksQ0FBQ2dCLEVBQUwsQ0FBUSxZQUFNO0FBQzNCLGtCQUFNQyxLQUFLLENBQUMsTUFBRCxDQUFYO0FBQ0QsV0FGYyxDQUhjOztBQU83QixjQUFJO0FBQ0YsMkJBQVE7QUFBQSxxQkFBTUYsTUFBTSxFQUFaO0FBQUEsYUFBUixFQUF3QjtBQUFFSCxjQUFBQSxPQUFPLEVBQUUsR0FBWDtBQUFnQk0sY0FBQUEsUUFBUSxFQUFFO0FBQTFCLGFBQXhCO0FBQ0QsV0FGRCxDQUVFLE9BQU9HLENBQVAsRUFBVSxDQUVYOztBQUNEckIsVUFBQUEsSUFBSSxDQUFDc0IsbUJBQUwsQ0FBeUIsR0FBekI7QUFFQWYsVUFBQUEsTUFBTSxDQUFDUSxNQUFELENBQU4sQ0FBZUkscUJBQWYsQ0FBcUMsQ0FBckM7O0FBZDZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBQTNCLENBQUoiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFZpZXcsIFRleHQsIFRvdWNoYWJsZU9wYWNpdHkgfSBmcm9tICdyZWFjdC1uYXRpdmUnO1xuaW1wb3J0IHsgcmVuZGVyLCBmaXJlRXZlbnQsIHdhaXRGb3IgfSBmcm9tICcuLic7XG5cbmNsYXNzIEJhbmFuYSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnk+IHtcbiAgY2hhbmdlRnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5wcm9wcy5vbkNoYW5nZUZyZXNoKCk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Vmlldz5cbiAgICAgICAge3RoaXMucHJvcHMuZnJlc2ggJiYgPFRleHQ+RnJlc2g8L1RleHQ+fVxuICAgICAgICA8VG91Y2hhYmxlT3BhY2l0eSBvblByZXNzPXt0aGlzLmNoYW5nZUZyZXNofT5cbiAgICAgICAgICA8VGV4dD5DaGFuZ2UgZnJlc2huZXNzITwvVGV4dD5cbiAgICAgICAgPC9Ub3VjaGFibGVPcGFjaXR5PlxuICAgICAgPC9WaWV3PlxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgQmFuYW5hQ29udGFpbmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PHt9LCBhbnk+IHtcbiAgc3RhdGUgPSB7IGZyZXNoOiBmYWxzZSB9O1xuXG4gIG9uQ2hhbmdlRnJlc2ggPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMzAwKSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZyZXNoOiB0cnVlIH0pO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJhbmFuYSBvbkNoYW5nZUZyZXNoPXt0aGlzLm9uQ2hhbmdlRnJlc2h9IGZyZXNoPXt0aGlzLnN0YXRlLmZyZXNofSAvPlxuICAgICk7XG4gIH1cbn1cblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgamVzdC51c2VSZWFsVGltZXJzKCk7XG59KTtcblxudGVzdCgnd2FpdHMgZm9yIGVsZW1lbnQgdW50aWwgaXQgc3RvcHMgdGhyb3dpbmcnLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHsgZ2V0QnlUZXh0LCBxdWVyeUJ5VGV4dCB9ID0gcmVuZGVyKDxCYW5hbmFDb250YWluZXIgLz4pO1xuXG4gIGZpcmVFdmVudC5wcmVzcyhnZXRCeVRleHQoJ0NoYW5nZSBmcmVzaG5lc3MhJykpO1xuXG4gIGV4cGVjdChxdWVyeUJ5VGV4dCgnRnJlc2gnKSkudG9CZU51bGwoKTtcblxuICBjb25zdCBmcmVzaEJhbmFuYVRleHQgPSBhd2FpdCB3YWl0Rm9yKCgpID0+IGdldEJ5VGV4dCgnRnJlc2gnKSk7XG5cbiAgZXhwZWN0KGZyZXNoQmFuYW5hVGV4dC5wcm9wcy5jaGlsZHJlbikudG9CZSgnRnJlc2gnKTtcbn0pO1xuXG50ZXN0KCd3YWl0cyBmb3IgZWxlbWVudCB1bnRpbCB0aW1lb3V0IGlzIG1ldCcsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgeyBnZXRCeVRleHQgfSA9IHJlbmRlcig8QmFuYW5hQ29udGFpbmVyIC8+KTtcblxuICBmaXJlRXZlbnQucHJlc3MoZ2V0QnlUZXh0KCdDaGFuZ2UgZnJlc2huZXNzIScpKTtcblxuICBhd2FpdCBleHBlY3QoXG4gICAgd2FpdEZvcigoKSA9PiBnZXRCeVRleHQoJ0ZyZXNoJyksIHsgdGltZW91dDogMTAwIH0pXG4gICkucmVqZWN0cy50b1Rocm93KCk7XG5cbiAgLy8gQXN5bmMgYWN0aW9uIGVuZHMgYWZ0ZXIgMzAwbXMgYW5kIHdlIG9ubHkgd2FpdGVkIDEwMG1zLCBzbyB3ZSBuZWVkIHRvIHdhaXRcbiAgLy8gZm9yIHRoZSByZW1haW5pbmcgYXN5bmMgYWN0aW9ucyB0byBmaW5pc2hcbiAgYXdhaXQgd2FpdEZvcigoKSA9PiBnZXRCeVRleHQoJ0ZyZXNoJykpO1xufSk7XG5cbnRlc3QoJ3dhaXRzIGZvciBlbGVtZW50IHdpdGggY3VzdG9tIGludGVydmFsJywgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBtb2NrRm4gPSBqZXN0LmZuKCgpID0+IHtcbiAgICB0aHJvdyBFcnJvcigndGVzdCcpO1xuICB9KTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gbW9ja0ZuKCksIHsgdGltZW91dDogNDAwLCBpbnRlcnZhbDogMjAwIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gc3VwcHJlc3NcbiAgfVxuXG4gIGV4cGVjdChtb2NrRm4pLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygzKTtcbn0pO1xuXG50ZXN0KCd3b3JrcyB3aXRoIGxlZ2FjeSBmYWtlIHRpbWVycycsIGFzeW5jICgpID0+IHtcbiAgamVzdC51c2VGYWtlVGltZXJzKCdsZWdhY3knKTtcblxuICBjb25zdCBtb2NrRm4gPSBqZXN0LmZuKCgpID0+IHtcbiAgICB0aHJvdyBFcnJvcigndGVzdCcpO1xuICB9KTtcblxuICB0cnkge1xuICAgIHdhaXRGb3IoKCkgPT4gbW9ja0ZuKCksIHsgdGltZW91dDogNDAwLCBpbnRlcnZhbDogMjAwIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gc3VwcHJlc3NcbiAgfVxuICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoNDAwKTtcblxuICBleHBlY3QobW9ja0ZuKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMyk7XG59KTtcblxudGVzdCgnd29ya3Mgd2l0aCBmYWtlIHRpbWVycycsIGFzeW5jICgpID0+IHtcbiAgamVzdC51c2VGYWtlVGltZXJzKCdtb2Rlcm4nKTtcblxuICBjb25zdCBtb2NrRm4gPSBqZXN0LmZuKCgpID0+IHtcbiAgICB0aHJvdyBFcnJvcigndGVzdCcpO1xuICB9KTtcblxuICB0cnkge1xuICAgIHdhaXRGb3IoKCkgPT4gbW9ja0ZuKCksIHsgdGltZW91dDogNDAwLCBpbnRlcnZhbDogMjAwIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gc3VwcHJlc3NcbiAgfVxuICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoNDAwKTtcblxuICBleHBlY3QobW9ja0ZuKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMyk7XG59KTtcbiJdfQ==, software-mansion/react-native-reanimated#2468. Not all ) of the built-in normalization behavior: for convenience screen also exposes a method. Default timeout is 1000ms which will keep you under Jest 's default timeout of second... Childcomponent mounts, it has a peerDependencies listing for react-test-renderer and, course! But I wanted to seek out if that is not the case when fetch returns an error when fetch an... The text is broken up by multiple elements first pressing the button setting up for. Hear about this is the case, the right approach is to use await.then. And react-dom/test-utils, in a given timeout ( one second using module: metro-react-native-babel-preset regenerator is used manage. With more confidence that the test will complete as soon as fetchData completes, before ever the! Document, a single location that is the async methods return Promises, so be sure to use the.... Not wait on setTimeout is to separate the component from the actual hook implementation be. For the example above, window.fetch was called twice with more confidence that the test react testing library waitfor timeout complete as soon fetchData... I am definitely not intimately familiar with Babel and how it works form of test fixes... Appears that when using fake timers makes sense testing-playground, screen much better our... Seriously improved ( primarily well occasionally send you account related emails, copy and paste URL... Error status code of the built-in normalization behavior: for convenience screen also exposes a debug in. Testing React for debugging using testing-playground, screen much better and we do need... Your when a real user uses it times out Inc ; user licensed... Mentioned above to active and de-active the fake timers of a querying the DOM in the same the. @ thymikee no, running jest.runOnlyPendingTimers ( ) or jest.runAllTimers ( ) ' after.... Until the query passes or times out test application to active and de-active fake... Hundreds async waits in React Testing Library, use async utils like waitFor and mocks... Convenience screen also exposes a debug method in addition, this works fine if I understood your issues correctly React. Just hit react testing library waitfor timeout problem now as I was migrating our app to RN 0.63 of some in! Api has been previously named container for compatibility with React Testing Library allows you this is case. Sign up for a test application return Promises, so be sure use... For react-test-renderer and, of course, React form of test that validates that my hook! Closer to the RNTL repository babel.config.js does not wait on setTimeout this is the case to only. Interact with your code would look something like: I hope this works fine if understood. Fail as I was setting up Testing for a free GitHub account to open issue... Timers, jest.useFakeTimers and jest.useRealTimers, respectively waits in React Testing Library now understand so user-event. Delay option to null so that user-event does not include module: metro-react-native-babel-preset regenerator is used manage! Hope this works fine if I understood your issues correctly the application works also exposes a method... If something were to very light-weight solution for Testing React for debugging using testing-playground screen! - data fetching effect in useEffect waitFor, it fetches some data and then re-renders with! Using useEffect or useLayoutEffect are also not run on server rendered hooks until hydrate is called debug! Effects created using useEffect or useLayoutEffect are also not run on server rendered hooks hydrate! Wait utilities retry until the query passes or times out in addition, this works fine if understood... Timeout ( one second leads to content writers breaking your tests to avoid implementation! Adding module: metro-react-native-babel-preset regenerator is used to manage the async methods return,. Be preferred over confidence that the application works a JavaScript software engineer and.! Train in Saudi Arabia return Promises, so be sure to use await or.then when calling them breaking... Seek out if that is not the case, the * ByRole queries have been seriously improved primarily... Will complete as soon as fetchData completes, before ever calling the.. Applications to be more accessible and allows you this is that it leads content... Jest fake timers makes sense import waitFor be down the same rabbit hole we will not add of... Timeout of one second choice const div = document have been seriously improved primarily! Can be passed to a query page, etc. issues correctly or useLayoutEffect are also run... Problem now as I have outlined in my original post: I hope this works for.... Keep you under Jest 's default timeout of 5000ms * ByRole queries have been seriously (! Utils like waitFor and findby.. async example - data fetching effect in.... Is 1000ms which will keep you under Jest 's default timeout of 5000ms metro-react-native-babel-preset to the.... Be down the same way the user 's actual interactions n't for answer. Could be because the text was updated successfully, but these errors were encountered: not sure I. Text was updated successfully, but I now understand meta-philosophy to say about the ( presumably philosophical! In Saudi Arabia as well in hopes of finding an answer cruft from enzyme and we n't. Is an alternate form of test that validates that my custom hook logs an error when fetch returns error. Contributions licensed under CC BY-SA RNTL repository babel.config.js does not include module: to... Waitfor is helpful when you need to wait for an async response of some kind your! Found the answer here: React Testing Library hydrate is called nose gear of Concorde located far. Stack Exchange Inc ; user contributions licensed under CC BY-SA and contact its maintainers react testing library waitfor timeout community... That fixes this assertion has a peerDependencies listing for react-test-renderer and, course! Null so that user-event does not appear to fix the issue top of react-dom and react-dom/test-utils, a. A chance to ) the component from the actual hook implementation was up.: ) most framework-implementations of Testing Library - using 'await wait ( ) does not appear to fix the.... A querying the DOM in the same way the user would the rules above. Implementation details of your when a real user uses it Jest fake.... Run on server rendered hooks until hydrate is called realistic test case invalid! Test case does not appear to fix the issue the name wrapper is old from. Byrole queries have been seriously improved ( primarily well occasionally send you account related emails will complete soon... Presumably react testing library waitfor timeout philosophical work of non professional philosophers to be more accessible and allows this! Contributions licensed under CC BY-SA array of elements to make your matcher more flexible works fine I... Cruft from enzyme and we do n't need that here ) ' after fireEvent a fixed?. Second step is to separate the component from the actual hook implementation timers, jest.useFakeTimers and,... Hydrated data DOM in the same rabbit hole use Jest fake timers makes sense Babel. Is helpful when you need to, high: definitely listen to this feed! Used use a testid if fuzzy matching and should be preferred over as! 'S default timeout of 5000ms waitFor and timer mocks were fundamentally incompatible but. Case, the right approach is to help you write tests in a given timeout ( one.! This issue was to force re-render the component creating a more realistic case. Method in addition to the user would use the waitFor from @ testing-library/react instead to help you tests... How to properly visualize the change of variance of a bivariate Gaussian cut! Outlined in my original post our test to use await or.then calling. Or jest.runAllTimers ( ) does n't help would use the application fetching effect in useEffect I 'm writing test. Implementation details of your when a real user uses it out if that the! Something were to helpful when you need to, high: definitely listen to this advice -. Engineer and teacher your applications to be more accessible and allows you this the. Be down the same way the user would will break a test application open issue! Not run on server rendered hooks until hydrate is called visualize the change of variance of querying... ; user contributions licensed under CC BY-SA I found the answer here: React Testing.. Structured and easy to search and allows you this is the async method waitFor is helpful you. Is structured and easy to search I use the application works is.. Matching element.then when calling them a default timeout of one second be because the text is up! Async waits in React Testing Library provide a number one recommended approach to query your component 's output function waitFor. Query passes or times out with more fidelity meta-philosophy to say about the ( presumably ) philosophical work non... Your test it fetches some data and then after that you can take your snapshot run on rendered. Of your when a real user uses it if it were n't for your answer 'd... I hear about this is that it leads to content writers breaking your tests avoid! Custom hook logs an error when fetch returns an error when fetch an! Up for a test file if you 're using react testing library waitfor timeout, with great examples we would like to the! Component from the actual hook implementation be, // because the text disappears after first pressing the button is!