Open
Description
react-hooks-testing-library
version: 7.0.1react
version: 17.0.2react-dom
version (if applicable): 17.0.2react-test-renderer
version (if applicable): N/Anode
version: 14.17.3npm
(oryarn
) 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