@samitouri / QOS-React / commits / 945fc1bfce

Call gDSFP with the right state in react-test-render (#13030)

* Call gDSFP with the right state in react-test-render * Change the test

Rafał Ruciński committed Jun 13, 2018 at 00:36 UTC 945fc1bfce5f2a93ac6ff0c53da3fd57e81b5a63
2 files changed +29 -2
packages/react-test-renderer/src/ReactShallowRenderer.js
+2 -2
@@ -238,14 +238,14 @@ class ReactShallowRenderer {
238 const {type} = this._element;
239
240 if (typeof type.getDerivedStateFromProps === 'function') {
241 + const oldState = this._newState || this._instance.state;
242 const partialState = type.getDerivedStateFromProps.call(
243 null,
244 props,
244 - this._instance.state,
245 + oldState,
246 );
247
248 if (partialState != null) {
248 - const oldState = this._newState || this._instance.state;
249 const newState = Object.assign({}, oldState, partialState);
250 this._instance.state = this._newState = newState;
251 }
packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js
+27
@@ -915,6 +915,33 @@ describe('ReactShallowRenderer', () => {
915 expect(result.props.children).toEqual(3);
916 });
917
918 + it('should not override state with stale values if prevState is spread within getDerivedStateFromProps', () => {
919 + class SimpleComponent extends React.Component {
920 + state = {value: 0};
921 +
922 + static getDerivedStateFromProps(nextProps, prevState) {
923 + return {...prevState};
924 + }
925 +
926 + updateState = () => {
927 + this.setState(state => ({value: state.value + 1}));
928 + };
929 +
930 + render() {
931 + return <div>{`value:${this.state.value}`}</div>;
932 + }
933 + }
934 +
935 + const shallowRenderer = createRenderer();
936 + let result = shallowRenderer.render(<SimpleComponent />);
937 + expect(result).toEqual(<div>value:0</div>);
938 +
939 + let instance = shallowRenderer.getMountedInstance();
940 + instance.updateState();
941 + result = shallowRenderer.getRenderOutput();
942 + expect(result).toEqual(<div>value:1</div>);
943 + });
944 +
945 it('can setState with an updater function', () => {
946 let instance;
947