1
- import React from 'react'
1
+ import React , { Suspense } from 'react'
2
2
import { render , cleanup , act } from 'react-testing-library'
3
3
4
4
function 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 }
9
17
}
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 ( ) {
10
35
return null
11
36
}
12
37
@@ -27,27 +52,34 @@ function resultContainer() {
27
52
}
28
53
}
29
54
55
+ const updateResult = ( val , err ) => {
56
+ value = val
57
+ error = err
58
+ resolvers . splice ( 0 , resolvers . length ) . forEach ( ( resolve ) => resolve ( ) )
59
+ }
60
+
30
61
return {
31
62
result,
32
63
addResolver : ( resolver ) => {
33
64
resolvers . push ( resolver )
34
65
} ,
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 )
40
68
}
41
69
}
42
70
43
71
function renderHook ( callback , { initialProps, ...options } = { } ) {
44
- const { result, updateResult , addResolver } = resultContainer ( )
72
+ const { result, setValue , setError , addResolver } = resultContainer ( )
45
73
const hookProps = { current : initialProps }
46
74
47
75
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 >
51
83
)
52
84
53
85
const { unmount, rerender : rerenderComponent } = render ( toRender ( ) , options )
0 commit comments