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