Skip to content

Commit 6827eb4

Browse files
committed
Capture all results a rendered hook produces.
Fixes #461
1 parent 40f11f4 commit 6827eb4

File tree

2 files changed

+44
-7
lines changed

2 files changed

+44
-7
lines changed

src/pure.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,28 @@ function Fallback() {
2121
}
2222

2323
function resultContainer() {
24-
let value = null
25-
let error = null
24+
const results = []
2625
const resolvers = []
2726

2827
const result = {
28+
get all() {
29+
return results.map(({ value, error }) => error || value)
30+
},
2931
get current() {
32+
const { value, error } = results[results.length - 1]
3033
if (error) {
3134
throw error
3235
}
3336
return value
3437
},
3538
get error() {
39+
const { error } = results[results.length - 1]
3640
return error
3741
}
3842
}
3943

40-
const updateResult = (val, err) => {
41-
value = val
42-
error = err
44+
const updateResult = (value, error) => {
45+
results.push({ value, error })
4346
resolvers.splice(0, resolvers.length).forEach((resolve) => resolve())
4447
}
4548

@@ -48,8 +51,8 @@ function resultContainer() {
4851
addResolver: (resolver) => {
4952
resolvers.push(resolver)
5053
},
51-
setValue: (val) => updateResult(val),
52-
setError: (err) => updateResult(undefined, err)
54+
setValue: (value) => updateResult(value),
55+
setError: (error) => updateResult(undefined, error)
5356
}
5457
}
5558

test/resultHistory.test.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { renderHook } from 'src'
2+
3+
describe('result history tests', () => {
4+
let count = 0
5+
function useCounter() {
6+
const result = count++
7+
if (result === 2) {
8+
throw Error('expected')
9+
}
10+
return result
11+
}
12+
13+
test('should capture all renders states of hook', () => {
14+
const { result, rerender } = renderHook(() => useCounter())
15+
16+
expect(result.current).toEqual(0)
17+
expect(result.all).toEqual([0])
18+
19+
rerender()
20+
21+
expect(result.current).toBe(1)
22+
expect(result.all).toEqual([0, 1])
23+
24+
rerender()
25+
26+
expect(result.error).toEqual(Error('expected'))
27+
expect(result.all).toEqual([0, 1, Error('expected')])
28+
29+
rerender()
30+
31+
expect(result.current).toBe(3)
32+
expect(result.all).toEqual([0, 1, Error('expected'), 3])
33+
})
34+
})

0 commit comments

Comments
 (0)