From 6827eb4903404f660c7a628b93844e459a594d22 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Thu, 3 Dec 2020 22:48:43 +1100 Subject: [PATCH 1/3] Capture all results a rendered hook produces. Fixes #461 --- src/pure.js | 17 ++++++++++------- test/resultHistory.test.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 test/resultHistory.test.js diff --git a/src/pure.js b/src/pure.js index 53ef84c5..435d0736 100644 --- a/src/pure.js +++ b/src/pure.js @@ -21,25 +21,28 @@ function Fallback() { } function resultContainer() { - let value = null - let error = null + const results = [] const resolvers = [] const result = { + get all() { + return results.map(({ value, error }) => error || value) + }, get current() { + const { value, error } = results[results.length - 1] if (error) { throw error } return value }, get error() { + const { error } = results[results.length - 1] return error } } - const updateResult = (val, err) => { - value = val - error = err + const updateResult = (value, error) => { + results.push({ value, error }) resolvers.splice(0, resolvers.length).forEach((resolve) => resolve()) } @@ -48,8 +51,8 @@ function resultContainer() { addResolver: (resolver) => { resolvers.push(resolver) }, - setValue: (val) => updateResult(val), - setError: (err) => updateResult(undefined, err) + setValue: (value) => updateResult(value), + setError: (error) => updateResult(undefined, error) } } diff --git a/test/resultHistory.test.js b/test/resultHistory.test.js new file mode 100644 index 00000000..ac37a0a2 --- /dev/null +++ b/test/resultHistory.test.js @@ -0,0 +1,34 @@ +import { renderHook } from 'src' + +describe('result history tests', () => { + let count = 0 + function useCounter() { + const result = count++ + if (result === 2) { + throw Error('expected') + } + return result + } + + test('should capture all renders states of hook', () => { + const { result, rerender } = renderHook(() => useCounter()) + + expect(result.current).toEqual(0) + expect(result.all).toEqual([0]) + + rerender() + + expect(result.current).toBe(1) + expect(result.all).toEqual([0, 1]) + + rerender() + + expect(result.error).toEqual(Error('expected')) + expect(result.all).toEqual([0, 1, Error('expected')]) + + rerender() + + expect(result.current).toBe(3) + expect(result.all).toEqual([0, 1, Error('expected'), 3]) + }) +}) From 110a4799387b15662bf089bb2806c29b21405dd3 Mon Sep 17 00:00:00 2001 From: Josh Ellis Date: Thu, 3 Dec 2020 23:32:32 +0000 Subject: [PATCH 2/3] docs: update to include 'all' value returned from renderHook --- docs/api-reference.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/api-reference.md b/docs/api-reference.md index b04f3739..42b7288b 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -63,13 +63,17 @@ The `renderHook` function returns an object that has the following properties: ```js { + all: Array current: any, error: Error } ``` -The `current` value or the `result` will reflect whatever is returned from the `callback` passed to -`renderHook`. Any thrown values will be reflected in the `error` value of the `result`. +The `current` value or the `result` will reflect the latest of whatever is returned from the +`callback` passed to `renderHook`. Any thrown values from the latest call will be reflected in the +`error` value of the `result`. The `all` value is an array containing all the returns (including the +most recent) from the callback. These could be `result` or an `error` depending on what the callback +returned at the time. ### `rerender` From 8090d1a45c771b0a3bb8a75b252598da3bfabf42 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Mon, 7 Dec 2020 20:48:34 +1100 Subject: [PATCH 3/3] fixed test import after repo changes --- test/resultHistory.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/resultHistory.test.js b/test/resultHistory.test.js index ac37a0a2..80b9b10b 100644 --- a/test/resultHistory.test.js +++ b/test/resultHistory.test.js @@ -1,4 +1,4 @@ -import { renderHook } from 'src' +import { renderHook } from '../src' describe('result history tests', () => { let count = 0