@@ -8,22 +8,19 @@ sidebar_label: Setup
88demonstrated in the example above). However, there are some things you can do
99when configuring your testing framework to reduce some boilerplate. In these
1010docs 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
4340Jest 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
7572global context providers, data stores, etc. To make this available globally, one
7673approach 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'
9487import { TranslationProvider } from ' my-i18n-lib'
9588import 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
111102export * from ' react-testing-library'
112103
113104// override render method
114105export { 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
197151NODE_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
202204If you're running your tests in the browser bundled with webpack (or similar)
0 commit comments