@@ -5,7 +5,7 @@ title: React Context
5
5
6
6
``` jsx
7
7
import React from ' react'
8
- import { render } from ' @testing-library/react'
8
+ import { render , screen } from ' @testing-library/react'
9
9
import ' @testing-library/jest-dom/extend-expect'
10
10
import { NameContext , NameProvider , NameConsumer } from ' ../react-context'
11
11
@@ -14,50 +14,65 @@ import { NameContext, NameProvider, NameConsumer } from '../react-context'
14
14
* matching provider
15
15
*/
16
16
test (' NameConsumer shows default value' , () => {
17
- const { getByText } = render (< NameConsumer / > )
18
- expect (getByText (/ ^ My Name Is:/ )).toHaveTextContent (' My Name Is: Unknown' )
17
+ render (< NameConsumer / > )
18
+ expect (screen .getByText (/ ^ My Name Is:/ )).toHaveTextContent (
19
+ ' My Name Is: Unknown'
20
+ )
19
21
})
20
22
21
23
/**
22
- * To test a component tree that uses a context consumer but not the provider,
23
- * wrap the tree with a matching provider
24
+ * A custom render to setup providers. Extends regular
25
+ * render options with `providerProps` to allow injecting
26
+ * different scenarios to test with.
27
+ *
28
+ * @see https://testing-library.com/docs/react-testing-library/setup#custom-render
24
29
*/
25
- test (' NameConsumer shows value from provider' , () => {
26
- const tree = (
27
- < NameContext .Provider value= " C3P0" >
28
- < NameConsumer / >
29
- < / NameContext .Provider >
30
+ const customRender = (ui , { providerProps, ... renderOptions }) => {
31
+ return render (
32
+ < NameContext .Provider {... providerProps}> {ui}< / NameContext .Provider > ,
33
+ renderOptions
30
34
)
31
- const { getByText } = render (tree)
32
- expect (getByText (/ ^ My Name Is:/ )).toHaveTextContent (' My Name Is: C3P0' )
35
+ }
36
+
37
+ test (' NameConsumer shows value from provider' , () => {
38
+ const providerProps = {
39
+ value: ' C3PO' ,
40
+ }
41
+ customRender (< NameConsumer / > , { providerProps })
42
+ expect (screen .getByText (/ ^ My Name Is:/ )).toHaveTextContent (' My Name Is: C3P0' )
33
43
})
34
44
35
45
/**
36
46
* To test a component that provides a context value, render a matching
37
47
* consumer as the child
38
48
*/
39
49
test (' NameProvider composes full name from first, last' , () => {
40
- const tree = (
41
- < NameProvider first= " Boba" last= " Fett" >
42
- < NameContext .Consumer >
43
- {value => < span> Received: {value}< / span> }
44
- < / NameContext .Consumer >
45
- < / NameProvider>
50
+ const providerProps = {
51
+ first: ' Boba' ,
52
+ last: ' Fett' ,
53
+ }
54
+ customRender (
55
+ < NameContext .Consumer >
56
+ {(value ) => < span> Received: {value}< / span> }
57
+ < / NameContext .Consumer > ,
58
+ { providerProps }
46
59
)
47
- const { getByText } = render (tree)
48
- expect (getByText (/ ^ Received:/ ).textContent ).toBe (' Received: Boba Fett' )
60
+ expect (screen .getByText (/ ^ Received:/ ).textContent ).toBe (' Received: Boba Fett' )
49
61
})
50
62
51
63
/**
52
64
* A tree containing both a providers and consumer can be rendered normally
53
65
*/
54
66
test (' NameProvider/Consumer shows name of character' , () => {
55
- const tree = (
67
+ const wrapper = ({ children }) => (
56
68
< NameProvider first= " Leia" last= " Organa" >
57
- < NameConsumer / >
69
+ {children}
58
70
< / NameProvider>
59
71
)
60
- const { getByText } = render (tree)
61
- expect (getByText (/ ^ My Name Is:/ ).textContent ).toBe (' My Name Is: Leia Organa' )
72
+
73
+ render (< NameConsumer / > , { wrapper })
74
+ expect (screen .getByText (/ ^ My Name Is:/ ).textContent ).toBe (
75
+ ' My Name Is: Leia Organa'
76
+ )
62
77
})
63
78
```
0 commit comments