Skip to content

Commit c47aae0

Browse files
committed
Revert "feat(render): options.wrapper api + customRender usage"
This reverts commit 2751c8c.
1 parent 2751c8c commit c47aae0

File tree

2 files changed

+86
-100
lines changed

2 files changed

+86
-100
lines changed

docs/react-testing-library/api.md

+16-32
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@ title: API
66
`react-testing-library` re-exports everything from `dom-testing-library` as well
77
as these methods:
88

9-
- [`render`](#act)
10-
- [`cleanup`](#cleanup)
11-
- [`act`](#act)
12-
13-
---
14-
159
## `render`
1610

1711
```typescript
@@ -50,17 +44,19 @@ test('renders a message', () => {
5044
> The [cleanup](#cleanup) function should be called between tests to remove the
5145
> created DOM nodes and keep the tests isolated.
5246

53-
## `render` Options
47+
### `render` Options
48+
49+
<details>
50+
51+
<summary>Expand to see documentation on the options</summary>
5452

5553
You wont often need to specify options, but if you ever do, here are the
5654
available options which you could provide as a second argument to `render`.
5755

58-
### `container`
59-
60-
By default, `react-testing-library` will create a `div` and append that div to
61-
the `document.body` and this is where your react component will be rendered. If
62-
you provide your own HTMLElement `container` via this option, it will not be
63-
appended to the `document.body` automatically.
56+
**container**: By default, `react-testing-library` will create a `div` and
57+
append that div to the `document.body` and this is where your react component
58+
will be rendered. If you provide your own HTMLElement `container` via this
59+
option, it will not be appended to the `document.body` automatically.
6460

6561
For Example: If you are unit testing a `tablebody` element, it cannot be a child
6662
of a `div`. In this case, you can specify a `table` as the render `container`.
@@ -73,34 +69,26 @@ const { container } = render(<TableBody {...props} />, {
7369
})
7470
```
7571

76-
### `baseElement`
77-
78-
If the `container` is specified, then this defaults to that, otherwise this
79-
defaults to `document.documentElement`. This is used as the base element for the
80-
queries as well as what is printed when you use `debug()`.
81-
82-
### `hydrate`
72+
**baseElement**: If the `container` is specified, then this defaults to that,
73+
otherwise this defaults to `document.documentElement`. This is used as the base
74+
element for the queries as well as what is printed when you use `debug()`.
8375

84-
If hydrate is set to true, then it will render with
76+
**hydrate**: If hydrate is set to true, then it will render with
8577
[ReactDOM.hydrate](https://reactjs.org/docs/react-dom.html#hydrate). This may be
8678
useful if you are using server-side rendering and use ReactDOM.hydrate to mount
8779
your components.
8880

89-
### `wrapper`
81+
</details>
9082

91-
Pass a React Component as the `wrapper` option to have it rendered around the
92-
inner element. This is most useful for creating reusable custom render functions
93-
for common data providers. See [setup](setup.md#custom-render) for examples.
94-
95-
## `render` Result
83+
---
9684

9785
The `render` method returns an object that has a few properties:
9886

9987
### `...queries`
10088

10189
The most important feature of `render` is that the queries from
10290
[dom-testing-library](api-queries.md) are automatically returned with their
103-
first argument bound to the document.
91+
first argument bound to the rendered container.
10492

10593
See [Queries](api-queries.md) for a complete list.
10694

@@ -234,8 +222,6 @@ fireEvent.click(getByText(/Click to increase/))
234222
expect(firstRender).toMatchDiffSnapshot(asFragment())
235223
```
236224
237-
---
238-
239225
## `cleanup`
240226
241227
Unmounts React trees that were mounted with [render](#render).
@@ -262,8 +248,6 @@ that you configure your test framework to run a file before your tests which
262248
does this automatically. See the [setup](./setup) section for guidance on how to
263249
set up your framework.
264250
265-
---
266-
267251
## `act`
268252
269253
This is a light wrapper around the

docs/react-testing-library/setup.md

+70-68
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,19 @@ sidebar_label: Setup
88
demonstrated in the example above). However, there are some things you can do
99
when configuring your testing framework to reduce some boilerplate. In these
1010
docs we'll demonstrate configuring Jest, but you should be able to do similar
11-
things with [any testing framework](#using-without-jest) (react-testing-library
12-
does not require that you use Jest).
11+
things with any testing framework (react-testing-library does not require that
12+
you use Jest).
1313

1414
## Global Config
1515

16-
Adding options to your global test config can simplify the setup and teardown of
17-
tests in individual files.
16+
There are several options you can add to your global test config that simplify
17+
the setup and teardown of tests in individual files. For example, you can ensure
18+
[`cleanup`](./api#cleanup) is called after each test and import additional
19+
assertions.
1820

19-
### Cleanup
20-
21-
You can ensure [`cleanup`](./api#cleanup) is called after each test and import
22-
additional assertions by adding it to the setup configuration in Jest.
23-
24-
In Jest 24 and up, add the
21+
To do this with Jest 24 and up, you can add the
2522
[`setupFilesAfterEnv`](https://jestjs.io/docs/en/configuration.html#setupfilesafterenv-array)
26-
option to your Jest config:
23+
option to your Jest config.
2724

2825
```javascript
2926
// jest.config.js
@@ -36,9 +33,9 @@ module.exports = {
3633
}
3734
```
3835

39-
<details>
36+
### Older versions of Jest
4037

41-
<summary>Older versions of Jest</summary>
38+
<details>
4239

4340
Jest versions 23 and below use the
4441
[`setupTestFrameworkScriptFile`](https://jestjs.io/docs/en/23.x/configuration#setuptestframeworkscriptfile-string)
@@ -75,11 +72,7 @@ It's often useful to define a custom render method that includes things like
7572
global context providers, data stores, etc. To make this available globally, one
7673
approach is to define a utility file that re-exports everything from
7774
`react-testing-library`. You can replace react-testing-library with this file in
78-
all your imports. See [below](#comfiguring-jest-with-test-utils) for a way to
79-
make your test util file accessible without using relative paths.
80-
81-
The example below sets up data providers using the
82-
[`wrapper`](api.md#render-options) option to `render`.
75+
all your imports.
8376

8477
```diff
8578
// my-component.test.js
@@ -94,64 +87,27 @@ import { ThemeProvider } from 'my-ui-lib'
9487
import { TranslationProvider } from 'my-i18n-lib'
9588
import defaultStrings from 'i18n/en-x-default'
9689

97-
const AllTheProviders = ({ children }) => {
98-
return (
90+
const customRender = (node, options) => {
91+
return render(
9992
<ThemeProvider theme="light">
10093
<TranslationProvider messages={defaultStrings}>
101-
{children}
94+
{node}
10295
</TranslationProvider>
103-
</ThemeProvider>
96+
</ThemeProvider>,
97+
options
10498
)
10599
}
106100

107-
const customRender = (ui, options) =>
108-
render(ui, { wrapper: AllTheProviders, ...options })
109-
110101
// re-export everything
111102
export * from 'react-testing-library'
112103

113104
// override render method
114105
export { customRender as render }
115106
```
116107

117-
> **Note**
118-
>
119-
> Babel versions lower than 7 throw an error when trying to override the named
120-
> export in the example above. See
121-
> [#169](https://github.com/kentcdodds/react-testing-library/issues/169) and the
122-
> workaround below.
123-
124-
<details>
125-
<summary>Workaround for Babel 6</summary>
126-
127-
You can use CommonJS modules instead of ES modules, which should work in Node:
128-
129-
```js
130-
// test-utils.js
131-
const rtl = require('react-testing-library')
132-
133-
const customRender = (ui, options) =>
134-
rtl.render(ui, {
135-
myDefaultOption: 'something',
136-
...options,
137-
})
138-
139-
module.exports = {
140-
...rtl,
141-
render: customRender,
142-
}
143-
```
144-
145-
</details>
146-
147-
### Configuring Jest with Test Utils
148-
149-
To make your custom test file accessible in your Jest test files without using
150-
relative imports (`../../test-utils`), add the folder containing the file to the
151-
Jest `moduleDirectories` option.
152-
153-
This will make all the `.js` files in the test-utils directory importable
154-
without `../`.
108+
To make this file accessible without using relative imports, add the folder
109+
containing the file to the Jest `moduleDirectories` option. Note: this will make
110+
_all_ the .js files in that directory importable without `../`.
155111

156112
```diff
157113
// my-component.test.js
@@ -172,11 +128,9 @@ module.exports = {
172128
}
173129
```
174130

175-
### Jest and Create React App
176-
177-
If your project is based on top of Create React App, to make the `test-utils`
178-
file accessible without using relative imports, you just need to create a `.env`
179-
file in the root of your project with the following configuration:
131+
If your project is based on top of Create React App, to make the file accessible
132+
without using relative imports, you just need to create a `.env` file in the
133+
root of your project with the following configuration:
180134

181135
```
182136
// Create React App project structure
@@ -197,6 +151,54 @@ $ app
197151
NODE_PATH=src/utils
198152
```
199153

154+
There is the case when you want to wrap your components in a `Provider`, this
155+
might cause conflicts when `rerender`ed. To achieve this, we suggest the
156+
`rerender` should be implemented the same way custom queries, by changing the
157+
return value of the customRender.
158+
159+
```js
160+
// test-utils.js
161+
162+
const customRender = (ui, options) => {
163+
const rendered = render(<div>{ui}</div>, options)
164+
return {
165+
...rendered,
166+
rerender: newUi =>
167+
customRender(newUi, {
168+
container: rendered.container,
169+
baseElement: rendered.baseElement,
170+
}),
171+
}
172+
}
173+
```
174+
175+
### Export Issue with Babel Versions Lower Than 7
176+
177+
Babel versions lower than 7 throw an error when trying to override the named
178+
export in the example above. (See
179+
[#169](https://github.com/kentcdodds/react-testing-library/issues/169).)
180+
181+
<details>
182+
<summary>Workaround</summary>
183+
184+
You can use CommonJS modules instead of ES modules, which should work in Node:
185+
186+
```js
187+
// test-utils.js
188+
const rtl = require('react-testing-library')
189+
190+
const customRender = (node, options) => {
191+
return rtl.render(<Something>{node}</Something>)
192+
}
193+
194+
module.exports = {
195+
...rtl,
196+
render: customRender,
197+
}
198+
```
199+
200+
</details>
201+
200202
## Using without Jest
201203

202204
If you're running your tests in the browser bundled with webpack (or similar)

0 commit comments

Comments
 (0)