From 945fc1bfce5f2a93ac6ff0c53da3fd57e81b5a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ruci=C5=84ski?= Date: Wed, 13 Jun 2018 00:36:50 +0200 Subject: [PATCH] Call gDSFP with the right state in react-test-render (#13030) * Call gDSFP with the right state in react-test-render * Change the test --- .../src/ReactShallowRenderer.js | 4 +-- .../__tests__/ReactShallowRenderer-test.js | 27 +++++++++++++++++++ 2 files changed, 29 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..b47495bca9818 100644 --- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js +++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js @@ -915,6 +915,33 @@ describe('ReactShallowRenderer', () => { expect(result.props.children).toEqual(3); }); + it('should not override state with stale values if prevState is spread within getDerivedStateFromProps', () => { + class SimpleComponent extends React.Component { + state = {value: 0}; + + static getDerivedStateFromProps(nextProps, prevState) { + return {...prevState}; + } + + updateState = () => { + this.setState(state => ({value: state.value + 1})); + }; + + render() { + return
{`value:${this.state.value}`}
; + } + } + + const shallowRenderer = createRenderer(); + let result = shallowRenderer.render(); + expect(result).toEqual(
value:0
); + + let instance = shallowRenderer.getMountedInstance(); + instance.updateState(); + result = shallowRenderer.getRenderOutput(); + expect(result).toEqual(
value:1
); + }); + it('can setState with an updater function', () => { let instance;