Skip to content

waitForNextUpdate is missing updates #656

Open
@brainkim

Description

@brainkim
  • react-hooks-testing-library version: 7.0.1
  • react version: 17.0.2
  • react-dom version (if applicable): 17.0.2
  • react-test-renderer version (if applicable): N/A
  • node version: 14.17.3
  • npm (or yarn) version: 6.14.3

Relevant code or config:

const React = require('react');
const Observable = require('zen-observable');
const {renderHook} = require('@testing-library/react-hooks');

function useObservable(observable) {
  const [state, setState] = React.useState(null);
  React.useEffect(() => {
    const subscription = observable.subscribe((state) => setState(state));
    return () => subscription.unsubscribe();
  }, [observable, setState]);

  return state;
}

it('lets you wait each update', async () => {
  let observer;
  const observable = new Observable((observer1) => (observer = observer1));
  const {result, waitForNextUpdate} = renderHook(
    () => useObservable(observable),
  );

  expect(result.current).toBe(null);
  setTimeout(() => {
    observer.next(1);
    Promise.resolve().then(() => {
      observer.next(2);
    });
  });

  console.log(result.all.length); // => 1
  await waitForNextUpdate();
  console.log(result.all.length); // => 3
  expect(result.current).toBe(1); // throws an error!
});

What you did:

Hi, I’m currently trying to adopt testing-library/react-hooks to clean up Apollo Client’s test suite. One problem I’m having is that waitForNextUpdate() sometimes misses renders, especially when multiple state updates happen in additional microtasks.

What happened:

waitForNextUpdate() misses an update.

Reproduction:

See the code above.

Problem description:

See above.

Suggested solution:

The waitForNextUpdate() function seems to call wait() but I don’t understand why we can’t just return a promise whose resolve function is added to addResolver()?
https://github.com/testing-library/react-hooks-testing-library/blob/main/src/core/asyncUtils.ts#L86-L98

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions