From 2ac8bfc73e948f6913852e90941d723c3b027e49 Mon Sep 17 00:00:00 2001 From: Sufian Rhazi Date: Wed, 25 Aug 2021 10:30:19 -0400 Subject: [PATCH] Add test to ensure we are calling selector on state change --- test/hooks/useSelector.spec.js | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/hooks/useSelector.spec.js b/test/hooks/useSelector.spec.js index 4da793c1b..8eb4bddf4 100644 --- a/test/hooks/useSelector.spec.js +++ b/test/hooks/useSelector.spec.js @@ -279,6 +279,46 @@ describe('React', () => { expect(numCalls).toBe(2) expect(renderedItems.length).toEqual(2) }) + + it('calls selector twice once on mount when state changes during render', () => { + store = createStore(({ count } = { count: 0 }) => ({ + count: count + 1, + })) + + let numCalls = 0 + const selector = (s) => { + numCalls += 1 + return s.count + } + const renderedItems = [] + + const Child = () => { + useLayoutEffect(() => { + store.dispatch({ type: '', count: 1 }) + }, []) + return
+ } + + const Comp = () => { + const value = useSelector(selector) + renderedItems.push(value) + return ( +
+ +
+ ) + } + + rtl.render( + + + + ) + + // Selector first called on Comp mount, and then re-invoked after mount due to useLayoutEffect dispatching event + expect(numCalls).toBe(2) + expect(renderedItems.length).toEqual(2) + }) }) it('uses the latest selector', () => {