|
1 | 1 | /*eslint-disable react/prop-types*/
|
2 | 2 |
|
3 |
| -import React from 'react' |
| 3 | +import React, { useCallback, useReducer } from 'react' |
4 | 4 | import { createStore } from 'redux'
|
5 | 5 | import { renderHook, act } from 'react-hooks-testing-library'
|
6 | 6 | import * as rtl from 'react-testing-library'
|
@@ -51,6 +51,29 @@ describe('React', () => {
|
51 | 51 | })
|
52 | 52 |
|
53 | 53 | describe('lifeycle interactions', () => {
|
| 54 | + it('always uses the latest state', () => { |
| 55 | + store = createStore(c => c + 1, -1) |
| 56 | + |
| 57 | + const Comp = () => { |
| 58 | + const selector = useCallback(c => c + 1, []) |
| 59 | + const value = useSelector(selector) |
| 60 | + renderedItems.push(value) |
| 61 | + return <div /> |
| 62 | + } |
| 63 | + |
| 64 | + rtl.render( |
| 65 | + <ProviderMock store={store}> |
| 66 | + <Comp /> |
| 67 | + </ProviderMock> |
| 68 | + ) |
| 69 | + |
| 70 | + expect(renderedItems).toEqual([1]) |
| 71 | + |
| 72 | + store.dispatch({ type: '' }) |
| 73 | + |
| 74 | + expect(renderedItems).toEqual([1, 2]) |
| 75 | + }) |
| 76 | + |
54 | 77 | it('subscribes to the store synchronously', () => {
|
55 | 78 | let rootSubscription
|
56 | 79 |
|
@@ -183,6 +206,39 @@ describe('React', () => {
|
183 | 206 | })
|
184 | 207 | })
|
185 | 208 |
|
| 209 | + it('uses the latest selector', () => { |
| 210 | + let selectorId = 0 |
| 211 | + let forceRender |
| 212 | + |
| 213 | + const Comp = () => { |
| 214 | + const [, f] = useReducer(c => c + 1, 0) |
| 215 | + forceRender = f |
| 216 | + const renderedSelectorId = selectorId++ |
| 217 | + const value = useSelector(() => renderedSelectorId) |
| 218 | + renderedItems.push(value) |
| 219 | + return <div /> |
| 220 | + } |
| 221 | + |
| 222 | + rtl.render( |
| 223 | + <ProviderMock store={store}> |
| 224 | + <Comp /> |
| 225 | + </ProviderMock> |
| 226 | + ) |
| 227 | + |
| 228 | + expect(renderedItems).toEqual([0]) |
| 229 | + |
| 230 | + rtl.act(forceRender) |
| 231 | + expect(renderedItems).toEqual([0, 1]) |
| 232 | + |
| 233 | + rtl.act(() => { |
| 234 | + store.dispatch({ type: '' }) |
| 235 | + }) |
| 236 | + expect(renderedItems).toEqual([0, 1]) |
| 237 | + |
| 238 | + rtl.act(forceRender) |
| 239 | + expect(renderedItems).toEqual([0, 1, 2]) |
| 240 | + }) |
| 241 | + |
186 | 242 | describe('edge cases', () => {
|
187 | 243 | it('ignores transient errors in selector (e.g. due to stale props)', () => {
|
188 | 244 | const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
|
|
0 commit comments