1
1
import * as React from 'react'
2
- import { render , waitForElementToBeRemoved , screen } from '../'
2
+ import { render , waitForElementToBeRemoved , screen , waitFor } from '../'
3
3
4
4
const fetchAMessage = ( ) =>
5
5
new Promise ( resolve => {
@@ -11,27 +11,63 @@ const fetchAMessage = () =>
11
11
} , randomTimeout )
12
12
} )
13
13
14
- class ComponentWithLoader extends React . Component {
15
- state = { loading : true }
16
- async componentDidMount ( ) {
17
- const data = await fetchAMessage ( )
18
- this . setState ( { data, loading : false } ) // eslint-disable-line
19
- }
20
- render ( ) {
21
- if ( this . state . loading ) {
22
- return < div > Loading...</ div >
14
+ function ComponentWithLoader ( ) {
15
+ const [ state , setState ] = React . useState ( { data : undefined , loading : true } )
16
+ React . useEffect ( ( ) => {
17
+ let cancelled = false
18
+ fetchAMessage ( ) . then ( data => {
19
+ if ( ! cancelled ) {
20
+ setState ( { data, loading : false } )
21
+ }
22
+ } )
23
+
24
+ return ( ) => {
25
+ cancelled = true
23
26
}
24
- return (
25
- < div data-testid = "message" >
26
- Loaded this message: { this . state . data . returnedMessage } !
27
- </ div >
28
- )
27
+ } , [ ] )
28
+
29
+ if ( state . loading ) {
30
+ return < div > Loading...</ div >
29
31
}
32
+
33
+ return (
34
+ < div data-testid = "message" >
35
+ Loaded this message: { state . data . returnedMessage } !
36
+ </ div >
37
+ )
30
38
}
31
39
32
- test ( 'it waits for the data to be loaded' , async ( ) => {
33
- render ( < ComponentWithLoader /> )
34
- const loading = ( ) => screen . getByText ( 'Loading...' )
35
- await waitForElementToBeRemoved ( loading )
36
- expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
40
+ describe . each ( [
41
+ [ 'real timers' , ( ) => jest . useRealTimers ( ) ] ,
42
+ [ 'fake legacy timers' , ( ) => jest . useFakeTimers ( 'legacy' ) ] ,
43
+ [ 'fake modern timers' , ( ) => jest . useFakeTimers ( 'modern' ) ] ,
44
+ ] ) ( 'it waits for the data to be loaded using %s' , ( label , useTimers ) => {
45
+ beforeEach ( ( ) => {
46
+ useTimers ( )
47
+ } )
48
+
49
+ afterEach ( ( ) => {
50
+ jest . useRealTimers ( )
51
+ } )
52
+
53
+ test ( 'waitForElementToBeRemoved' , async ( ) => {
54
+ render ( < ComponentWithLoader /> )
55
+ const loading = ( ) => screen . getByText ( 'Loading...' )
56
+ await waitForElementToBeRemoved ( loading )
57
+ expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
58
+ } )
59
+
60
+ test ( 'waitFor' , async ( ) => {
61
+ render ( < ComponentWithLoader /> )
62
+ const message = ( ) => screen . getByText ( / L o a d e d t h i s m e s s a g e : / )
63
+ await waitFor ( message )
64
+ expect ( screen . getByTestId ( 'message' ) ) . toHaveTextContent ( / H e l l o W o r l d / )
65
+ } )
66
+
67
+ test ( 'findBy' , async ( ) => {
68
+ render ( < ComponentWithLoader /> )
69
+ await expect ( screen . findByTestId ( 'message' ) ) . resolves . toHaveTextContent (
70
+ / H e l l o W o r l d / ,
71
+ )
72
+ } )
37
73
} )
0 commit comments