@@ -252,14 +252,30 @@ test('requires either a fallback, fallbackRender, or FallbackComponent', () => {
252
252
} )
253
253
254
254
test ( 'supports automatic reset of error boundary when resetKeys change' , ( ) => {
255
+ const handleReset = jest . fn ( )
256
+ const TRY_AGAIN_ARG1 = 'TRY_AGAIN_ARG1'
257
+ const TRY_AGAIN_ARG2 = 'TRY_AGAIN_ARG2'
255
258
function App ( ) {
256
259
const [ explode , setExplode ] = React . useState ( false )
257
260
return (
258
261
< div >
259
262
< button onClick = { ( ) => setExplode ( e => ! e ) } > toggle explode</ button >
260
263
< ErrorBoundary
261
- FallbackComponent = { ErrorFallback }
262
- onReset = { ( ) => setExplode ( false ) }
264
+ fallbackRender = { ( { resetErrorBoundary} ) => (
265
+ < div role = "alert" >
266
+ < button
267
+ onClick = { ( ) =>
268
+ resetErrorBoundary ( TRY_AGAIN_ARG1 , TRY_AGAIN_ARG2 )
269
+ }
270
+ >
271
+ Try again
272
+ </ button >
273
+ </ div >
274
+ ) }
275
+ onReset = { ( ...args ) => {
276
+ setExplode ( false )
277
+ handleReset ( ...args )
278
+ } }
263
279
resetKeys = { [ explode ] }
264
280
>
265
281
{ explode ? < Bomb /> : null }
@@ -268,21 +284,32 @@ test('supports automatic reset of error boundary when resetKeys change', () => {
268
284
)
269
285
}
270
286
render ( < App /> )
271
- userEvent . click ( screen . getByText ( 'toggle explode' ) )
272
287
288
+ // blow it up
289
+ userEvent . click ( screen . getByText ( 'toggle explode' ) )
273
290
screen . getByRole ( 'alert' )
274
291
expect ( console . error ) . toHaveBeenCalledTimes ( 2 )
275
292
console . error . mockClear ( )
276
293
294
+ // recover via try again button
277
295
userEvent . click ( screen . getByText ( / t r y a g a i n / i) )
278
296
expect ( screen . queryByRole ( 'alert' ) ) . not . toBeInTheDocument ( )
297
+ expect ( console . error ) . not . toHaveBeenCalled ( )
298
+ expect ( handleReset ) . toHaveBeenCalledWith ( TRY_AGAIN_ARG1 , TRY_AGAIN_ARG2 )
299
+ expect ( handleReset ) . toHaveBeenCalledTimes ( 1 )
300
+ handleReset . mockClear ( )
279
301
302
+ // blow it up again
280
303
userEvent . click ( screen . getByText ( 'toggle explode' ) )
281
304
screen . getByRole ( 'alert' )
282
305
expect ( console . error ) . toHaveBeenCalledTimes ( 2 )
283
306
console . error . mockClear ( )
284
307
308
+ // recover via resetKeys change
285
309
userEvent . click ( screen . getByText ( 'toggle explode' ) )
310
+ expect ( handleReset ) . toHaveBeenCalledWith ( [ true ] , [ false ] )
311
+ expect ( handleReset ) . toHaveBeenCalledTimes ( 1 )
312
+ handleReset . mockClear ( )
286
313
expect ( screen . queryByRole ( 'alert' ) ) . not . toBeInTheDocument ( )
287
314
expect ( console . error ) . not . toHaveBeenCalled ( )
288
315
} )
0 commit comments