@@ -5,7 +5,7 @@ title: React Context
55
66``` jsx
77import React from ' react'
8- import { render } from ' @testing-library/react'
8+ import { render , screen } from ' @testing-library/react'
99import ' @testing-library/jest-dom/extend-expect'
1010import { NameContext , NameProvider , NameConsumer } from ' ../react-context'
1111
@@ -14,50 +14,65 @@ import { NameContext, NameProvider, NameConsumer } from '../react-context'
1414 * matching provider
1515 */
1616test (' 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+ )
1921})
2022
2123/**
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
2429 */
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
3034 )
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' )
3343})
3444
3545/**
3646 * To test a component that provides a context value, render a matching
3747 * consumer as the child
3848 */
3949test (' 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 }
4659 )
47- const { getByText } = render (tree)
48- expect (getByText (/ ^ Received:/ ).textContent ).toBe (' Received: Boba Fett' )
60+ expect (screen .getByText (/ ^ Received:/ ).textContent ).toBe (' Received: Boba Fett' )
4961})
5062
5163/**
5264 * A tree containing both a providers and consumer can be rendered normally
5365 */
5466test (' NameProvider/Consumer shows name of character' , () => {
55- const tree = (
67+ const wrapper = ({ children }) => (
5668 < NameProvider first= " Leia" last= " Organa" >
57- < NameConsumer / >
69+ {children}
5870 < / NameProvider>
5971 )
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+ )
6277})
6378```
0 commit comments