Skip to content

Commit 735d7b4

Browse files
committed
Use flushEffects instead of the rerender hack.
1 parent 246b41a commit 735d7b4

File tree

3 files changed

+70
-52
lines changed

3 files changed

+70
-52
lines changed

package-lock.json

Lines changed: 30 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
"jest-dom": "2.1.0",
4848
"react": "16.7.0-alpha.0",
4949
"react-dom": "16.7.0-alpha.0",
50-
"react-testing-library": "5.2.3",
50+
"react-testing-library": "5.3.1",
5151
"rimraf": "2.6.2"
5252
},
5353
"jest": {

src/useAsync.spec.js

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import "jest-dom/extend-expect"
22
import React from "react"
3-
import { render, fireEvent, cleanup, waitForElement } from "react-testing-library"
3+
import { render, fireEvent, cleanup, waitForElement, flushEffects } from "react-testing-library"
44
import { useAsync } from "."
55

66
afterEach(cleanup)
@@ -13,16 +13,16 @@ const Async = ({ children = () => null, ...props }) => children(useAsync(props))
1313
test("useAsync returns render props", async () => {
1414
const promiseFn = () => new Promise(resolve => setTimeout(resolve, 0, "done"))
1515
const component = <Async promiseFn={promiseFn}>{({ data }) => data || null}</Async>
16-
const { getByText, rerender } = render(component)
17-
rerender(component) // needed to trigger useEffect
16+
const { getByText } = render(component)
17+
flushEffects()
1818
await waitForElement(() => getByText("done"))
1919
})
2020

2121
test("useAsync passes rejection error to children as render prop", async () => {
2222
const promiseFn = () => Promise.reject("oops")
2323
const component = <Async promiseFn={promiseFn}>{({ error }) => error || null}</Async>
24-
const { getByText, rerender } = render(component)
25-
rerender(component)
24+
const { getByText } = render(component)
25+
flushEffects()
2626
await waitForElement(() => getByText("oops"))
2727
})
2828

@@ -37,8 +37,8 @@ test("useAsync passes isLoading boolean while the promise is running", async ()
3737
}}
3838
</Async>
3939
)
40-
const { getByText, rerender } = render(component)
41-
rerender(component)
40+
const { getByText } = render(component)
41+
flushEffects()
4242
await waitForElement(() => getByText("done"))
4343
expect(states).toEqual([true, true, false])
4444
})
@@ -56,8 +56,8 @@ test("useAsync passes startedAt date when the promise starts", async () => {
5656
}}
5757
</Async>
5858
)
59-
const { getByText, rerender } = render(component)
60-
rerender(component)
59+
const { getByText } = render(component)
60+
flushEffects()
6161
await waitForElement(() => getByText("started"))
6262
})
6363

@@ -74,16 +74,16 @@ test("useAsync passes finishedAt date when the promise finishes", async () => {
7474
}}
7575
</Async>
7676
)
77-
const { getByText, rerender } = render(component)
78-
rerender(component)
77+
const { getByText } = render(component)
78+
flushEffects()
7979
await waitForElement(() => getByText("done"))
8080
})
8181

8282
test("useAsync passes reload function that re-runs the promise", async () => {
8383
const promiseFn = jest.fn().mockReturnValue(resolveTo("done"))
8484
const component = <Async promiseFn={promiseFn}>{({ reload }) => <button onClick={reload}>reload</button>}</Async>
85-
const { getByText, rerender } = render(component)
86-
rerender(component)
85+
const { getByText } = render(component)
86+
flushEffects()
8787
expect(promiseFn).toHaveBeenCalledTimes(1)
8888
fireEvent.click(getByText("reload"))
8989
expect(promiseFn).toHaveBeenCalledTimes(2)
@@ -104,14 +104,14 @@ test("useAsync re-runs the promise when the value of 'watch' changes", () => {
104104
}
105105
const promiseFn = jest.fn().mockReturnValue(resolveTo())
106106
const component = <Counter>{count => <Async promiseFn={promiseFn} watch={count} />}</Counter>
107-
const { getByText, rerender } = render(component)
108-
rerender(component)
107+
const { getByText } = render(component)
108+
flushEffects()
109109
expect(promiseFn).toHaveBeenCalledTimes(1)
110110
fireEvent.click(getByText("increment"))
111-
rerender(component)
111+
flushEffects()
112112
expect(promiseFn).toHaveBeenCalledTimes(2)
113113
fireEvent.click(getByText("increment"))
114-
rerender(component)
114+
flushEffects()
115115
expect(promiseFn).toHaveBeenCalledTimes(3)
116116
})
117117

@@ -125,8 +125,8 @@ test("useAsync runs deferFn only when explicitly invoked, passing arguments and
125125
}}
126126
</Async>
127127
)
128-
const { getByText, rerender } = render(component)
129-
rerender(component)
128+
const { getByText } = render(component)
129+
flushEffects()
130130
expect(deferFn).not.toHaveBeenCalled()
131131
fireEvent.click(getByText("run"))
132132
expect(deferFn).toHaveBeenCalledWith("go", 1, expect.objectContaining({ deferFn, foo: "bar" }))
@@ -149,8 +149,8 @@ test("useAsync reload uses the arguments of the previous run", () => {
149149
}}
150150
</Async>
151151
)
152-
const { getByText, rerender } = render(component)
153-
rerender(component)
152+
const { getByText } = render(component)
153+
flushEffects()
154154
expect(deferFn).not.toHaveBeenCalled()
155155
fireEvent.click(getByText("run"))
156156
expect(deferFn).toHaveBeenCalledWith("go", 1, expect.objectContaining({ deferFn }))
@@ -187,8 +187,8 @@ test("useAsync invokes onResolve callback when promise resolves", async () => {
187187
const promiseFn = jest.fn().mockReturnValue(Promise.resolve("ok"))
188188
const onResolve = jest.fn()
189189
const component = <Async promiseFn={promiseFn} onResolve={onResolve} />
190-
const { rerender } = render(component)
191-
rerender(component)
190+
render(component)
191+
flushEffects()
192192
await Promise.resolve()
193193
expect(onResolve).toHaveBeenCalledWith("ok")
194194
})
@@ -197,8 +197,8 @@ test("useAsync invokes onReject callback when promise rejects", async () => {
197197
const promiseFn = jest.fn().mockReturnValue(Promise.reject("err"))
198198
const onReject = jest.fn()
199199
const component = <Async promiseFn={promiseFn} onReject={onReject} />
200-
const { rerender } = render(component)
201-
rerender(component)
200+
render(component)
201+
flushEffects()
202202
await Promise.resolve()
203203
expect(onReject).toHaveBeenCalledWith("err")
204204
})
@@ -207,8 +207,8 @@ test("useAsync cancels pending promise when unmounted", async () => {
207207
const promiseFn = jest.fn().mockReturnValue(Promise.resolve("ok"))
208208
const onResolve = jest.fn()
209209
const component = <Async promiseFn={promiseFn} onResolve={onResolve} />
210-
const { unmount, rerender } = render(component)
211-
rerender(component)
210+
const { unmount } = render(component)
211+
flushEffects()
212212
unmount()
213213
await Promise.resolve()
214214
expect(onResolve).not.toHaveBeenCalled()
@@ -222,10 +222,10 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
222222
const component2 = <Async promiseFn={promiseFn2} onResolve={onResolve} />
223223
const { rerender } = render(component1)
224224
await Promise.resolve()
225-
rerender(component1)
225+
flushEffects()
226226
expect(promiseFn1).toHaveBeenCalled()
227227
rerender(component2)
228-
rerender(component2)
228+
flushEffects()
229229
expect(promiseFn2).toHaveBeenCalled()
230230
expect(onResolve).not.toHaveBeenCalledWith("one")
231231
await Promise.resolve()
@@ -235,8 +235,8 @@ test("useAsync cancels and restarts the promise when promiseFn changes", async (
235235
test("useAsync does not run promiseFn on mount when initialValue is provided", () => {
236236
const promiseFn = jest.fn().mockReturnValue(Promise.resolve())
237237
const component = <Async promiseFn={promiseFn} initialValue={{}} />
238-
const { rerender } = render(component)
239-
rerender(component)
238+
render(component)
239+
flushEffects()
240240
expect(promiseFn).not.toHaveBeenCalled()
241241
})
242242

@@ -251,8 +251,8 @@ test("useAsync does not start loading when using initialValue", async () => {
251251
}}
252252
</Async>
253253
)
254-
const { getByText, rerender } = render(component)
255-
rerender(component)
254+
const { getByText } = render(component)
255+
flushEffects()
256256
await waitForElement(() => getByText("done"))
257257
expect(states).toEqual([false])
258258
})
@@ -264,8 +264,8 @@ test("useAsync passes initialValue to children immediately", async () => {
264264
{({ data }) => data}
265265
</Async>
266266
)
267-
const { getByText, rerender } = render(component)
268-
rerender(component)
267+
const { getByText } = render(component)
268+
flushEffects()
269269
await waitForElement(() => getByText("done"))
270270
})
271271

@@ -277,8 +277,8 @@ test("useAsync sets error instead of data when initialValue is an Error object",
277277
{({ error }) => error.message}
278278
</Async>
279279
)
280-
const { getByText, rerender } = render(component)
281-
rerender(component)
280+
const { getByText } = render(component)
281+
flushEffects()
282282
await waitForElement(() => getByText("oops"))
283283
})
284284

@@ -296,8 +296,8 @@ test("useAsync can be nested", async () => {
296296
)}
297297
</Async>
298298
)
299-
const { getByText, rerender } = render(component)
300-
rerender(component)
299+
const { getByText } = render(component)
300+
flushEffects()
301301
await waitForElement(() => getByText("outer undefined"))
302302
await waitForElement(() => getByText("outer inner"))
303303
})

0 commit comments

Comments
 (0)