Skip to content

Commit bad7347

Browse files
authored
Chore/update react context example (#581)
1 parent 4c43c96 commit bad7347

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

docs/example-react-context.md

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: React Context
55

66
```jsx
77
import React from 'react'
8-
import { render } from '@testing-library/react'
8+
import { render, screen } from '@testing-library/react'
99
import '@testing-library/jest-dom/extend-expect'
1010
import { NameContext, NameProvider, NameConsumer } from '../react-context'
1111

@@ -14,50 +14,65 @@ import { NameContext, NameProvider, NameConsumer } from '../react-context'
1414
* matching provider
1515
*/
1616
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+
)
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
*/
3949
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 }
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
*/
5466
test('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

Comments
 (0)