From fdee5c7a6e7665a6c54073f86747ffb04cfed660 Mon Sep 17 00:00:00 2001 From: fatfisz Date: Tue, 12 Jun 2018 21:25:32 +0200 Subject: [PATCH 1/2] Call gDSFP with the right state in react-test-render --- .../src/ReactShallowRenderer.js | 4 +-- .../__tests__/ReactShallowRenderer-test.js | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/react-test-renderer/src/ReactShallowRenderer.js b/packages/react-test-renderer/src/ReactShallowRenderer.js index 3134f991eeaf2..0c1f7178831f9 100644 --- a/packages/react-test-renderer/src/ReactShallowRenderer.js +++ b/packages/react-test-renderer/src/ReactShallowRenderer.js @@ -238,14 +238,14 @@ class ReactShallowRenderer { const {type} = this._element; if (typeof type.getDerivedStateFromProps === 'function') { + const oldState = this._newState || this._instance.state; const partialState = type.getDerivedStateFromProps.call( null, props, - this._instance.state, + oldState, ); if (partialState != null) { - const oldState = this._newState || this._instance.state; const newState = Object.assign({}, oldState, partialState); this._instance.state = this._newState = newState; } diff --git a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js index eb8942a520959..fc86d33712464 100644 --- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js @@ -915,6 +915,39 @@ describe('ReactShallowRenderer', () => { expect(result.props.children).toEqual(3); }); + it('should call getDerivedStateFromProps with the state set by setState', () => { + class SimpleComponent extends React.Component { + state = {count: 1}; + + static getDerivedStateFromProps(nextProps, prevState) { + if (nextProps.updateState) { + return {count: nextProps.incrementBy + prevState.count}; + } + + return null; + } + + render() { + return
{this.state.count}
; + } + } + + const shallowRenderer = createRenderer(); + shallowRenderer.render( + , + ); + let instance = shallowRenderer.getMountedInstance(); + instance.setState({count: 2}); + expect(instance.state.count).toEqual(2); + + shallowRenderer.render( + , + ); + instance = shallowRenderer.getMountedInstance(); + instance.setState({count: 2}); + expect(instance.state.count).toEqual(4); + }); + it('can setState with an updater function', () => { let instance; From 98821dba04c0890bae8a721da22d89688a7b2027 Mon Sep 17 00:00:00 2001 From: fatfisz Date: Wed, 13 Jun 2018 00:20:19 +0200 Subject: [PATCH 2/2] Change the test --- .../__tests__/ReactShallowRenderer-test.js | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js index fc86d33712464..b47495bca9818 100644 --- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js @@ -915,37 +915,31 @@ describe('ReactShallowRenderer', () => { expect(result.props.children).toEqual(3); }); - it('should call getDerivedStateFromProps with the state set by setState', () => { + it('should not override state with stale values if prevState is spread within getDerivedStateFromProps', () => { class SimpleComponent extends React.Component { - state = {count: 1}; + state = {value: 0}; static getDerivedStateFromProps(nextProps, prevState) { - if (nextProps.updateState) { - return {count: nextProps.incrementBy + prevState.count}; - } - - return null; + return {...prevState}; } + updateState = () => { + this.setState(state => ({value: state.value + 1})); + }; + render() { - return
{this.state.count}
; + return
{`value:${this.state.value}`}
; } } const shallowRenderer = createRenderer(); - shallowRenderer.render( - , - ); - let instance = shallowRenderer.getMountedInstance(); - instance.setState({count: 2}); - expect(instance.state.count).toEqual(2); + let result = shallowRenderer.render(); + expect(result).toEqual(
value:0
); - shallowRenderer.render( - , - ); - instance = shallowRenderer.getMountedInstance(); - instance.setState({count: 2}); - expect(instance.state.count).toEqual(4); + let instance = shallowRenderer.getMountedInstance(); + instance.updateState(); + result = shallowRenderer.getRenderOutput(); + expect(result).toEqual(
value:1
); }); it('can setState with an updater function', () => {