Skip to content

unit testing at odds with queryCache #460

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
jackmellis opened this issue May 6, 2020 · 7 comments
Closed

unit testing at odds with queryCache #460

jackmellis opened this issue May 6, 2020 · 7 comments
Labels

Comments

@jackmellis
Copy link
Contributor

jackmellis commented May 6, 2020

I'm having trouble working out the best way to test using react-query. I've looked at #113 but it doesn't solve my issues.

I've got a pretty good DI pattern for the actual fetching of data so that's not an issue. The issue I have is the queryCache persisting between tests. I can explicitly clear the cache before/after each test, but that doesn't help if you've got multiple async tests running in parallel.

Rather than importing a global queryCache, would it be helpful to store it in a react context, and then in your tests you can pass in a fresh cache for each test i.e.

mount(
  <QueryCacheProvider>
    <MyComponent/>
  <QueryCacheProvider>
)

or add it to the existing config provider.

The other issue I have is that my test runner (mocha) is hanging forever after the tests have run. I assume this is because of some internal timeouts/intervals/evenListeners or something. Am I missing some obvious way to stop them?

An example of an extremely simple test that's both failing and hanging:

      const Sink = createSink(() => {
        useAccount('foo'); // useAccount just calls useQuery
        expect(mockApiCall.called).to.be.true;
      });
      
      mount(
        <Wrapper>
          <Sink/>
        </Wrapper>
      );

(the reason it's failing is because a previous test has already called the useQuery hook and cached the response, if I ran a single test in isolation, it passes)

I think my bottom line of all this is I think react-query could do with some official ways to make unit testing easier (and keeping things isolated)

@jackmellis
Copy link
Contributor Author

jackmellis commented May 6, 2020

you can ignore the "hanging" part, I forgot you have to manually unmount enzyme-mounted components 🤦

please ignore my ignore statement as my tests are still hanging intermittently 😞

@KerrGrah
Copy link

KerrGrah commented May 6, 2020

thanks for raising this - your suggestion to clear the cache is sufficient for me
beforeEach(queryCache.clear)

would be great if was built-in

@iamtekeste
Copy link

iamtekeste commented Jun 15, 2020

@KerrGrah how do you get access to queryCache from inside your test? As in how do I import it?

@KerrGrah
Copy link

@iamtekeste
import { queryCache } from 'react-query' :)

@iamtekeste
Copy link

@iamtekeste
import { queryCache } from 'react-query' :)

I can't believe it was that easy! Thank you.

@adeelibr
Copy link

adeelibr commented Feb 1, 2021

How can you use queryCache in react-query v3 inside tests?

@TkDodo
Copy link
Collaborator

TkDodo commented Feb 1, 2021

it's QueryClient now, and you have to create a new one and wrap your component in a ReactQueryClientProvider. You can then just use the crated instance, or it will be given to you via the useQueryClient hook.

I find it best to wrap each component in a test in a new queryClient so that they are isolated and I don't need to clear things between tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants