1- import React from 'react'
1+ import React , { Suspense } from 'react'
22import { render , cleanup , act } from 'react-testing-library'
33
44function TestHook ( { callback, hookProps, children } ) {
5- try {
6- children ( callback ( hookProps ) )
7- } catch ( e ) {
8- children ( undefined , e )
5+ children ( callback ( hookProps ) )
6+ return null
7+ }
8+
9+ class ErrorBoundary extends React . Component {
10+ constructor ( props ) {
11+ super ( props )
12+ this . state = { hasError : false }
13+ }
14+
15+ static getDerivedStateFromError ( ) {
16+ return { hasError : true }
917 }
18+
19+ componentDidCatch ( error ) {
20+ this . props . onError ( error )
21+ }
22+
23+ componentDidUpdate ( prevProps ) {
24+ if ( this . props != prevProps && this . state . hasError ) {
25+ this . setState ( { hasError : false } )
26+ }
27+ }
28+
29+ render ( ) {
30+ return ! this . state . hasError && this . props . children
31+ }
32+ }
33+
34+ function Fallback ( ) {
1035 return null
1136}
1237
@@ -27,27 +52,34 @@ function resultContainer() {
2752 }
2853 }
2954
55+ const updateResult = ( val , err ) => {
56+ value = val
57+ error = err
58+ resolvers . splice ( 0 , resolvers . length ) . forEach ( ( resolve ) => resolve ( ) )
59+ }
60+
3061 return {
3162 result,
3263 addResolver : ( resolver ) => {
3364 resolvers . push ( resolver )
3465 } ,
35- updateResult : ( val , err ) => {
36- value = val
37- error = err
38- resolvers . splice ( 0 , resolvers . length ) . forEach ( ( resolve ) => resolve ( ) )
39- }
66+ setValue : ( val ) => updateResult ( val ) ,
67+ setError : ( err ) => updateResult ( undefined , err )
4068 }
4169}
4270
4371function renderHook ( callback , { initialProps, ...options } = { } ) {
44- const { result, updateResult , addResolver } = resultContainer ( )
72+ const { result, setValue , setError , addResolver } = resultContainer ( )
4573 const hookProps = { current : initialProps }
4674
4775 const toRender = ( ) => (
48- < TestHook callback = { callback } hookProps = { hookProps . current } >
49- { updateResult }
50- </ TestHook >
76+ < ErrorBoundary onError = { setError } >
77+ < Suspense fallback = { < Fallback /> } >
78+ < TestHook callback = { callback } hookProps = { hookProps . current } >
79+ { setValue }
80+ </ TestHook >
81+ </ Suspense >
82+ </ ErrorBoundary >
5183 )
5284
5385 const { unmount, rerender : rerenderComponent } = render ( toRender ( ) , options )
0 commit comments