849
expect(result).toEqual(<div>baz:bar</div>);
850
});
851
852
+ it('this.state should be updated on setState callback inside componentWillMount', () => {
853
+ let stateSuccessfullyUpdated = false;
854
+
855
+ class Component extends React.Component {
856
+ constructor(props, context) {
857
+ super(props, context);
858
+ this.state = {
859
+ hasUpdatedState: false,
860
+ };
861
+ }
862
+
863
+ componentWillMount() {
864
+ this.setState(
865
+ {hasUpdatedState: true},
866
+ () => (stateSuccessfullyUpdated = this.state.hasUpdatedState),
867
+ );
868
+ }
869
+
870
+ render() {
871
+ return <div>{this.props.children}</div>;
872
+ }
873
+ }
874
+
875
+ const shallowRenderer = createRenderer();
876
+ shallowRenderer.render(<Component />);
877
+ expect(stateSuccessfullyUpdated).toBe(true);
878
+ });
879
+
880
+ it('should handle multiple callbacks', () => {
881
+ const mockFn = jest.fn();
882
+ const shallowRenderer = createRenderer();
883
+
884
+ class Component extends React.Component {
885
+ constructor(props, context) {
886
+ super(props, context);
887
+ this.state = {
888
+ foo: 'foo',
889
+ };
890
+ }
891
+
892
+ componentWillMount() {
893
+ this.setState({foo: 'bar'}, () => mockFn());
894
+ this.setState({foo: 'foobar'}, () => mockFn());
895
+ }
896
+
897
+ render() {
898
+ return <div>{this.state.foo}</div>;
899
+ }
900
+ }
901
+
902
+ shallowRenderer.render(<Component />);
903
+
904
+ expect(mockFn.mock.calls.length).toBe(2);
905
+
906
+ // Ensure the callback queue is cleared after the callbacks are invoked
907
+ const mountedInstance = shallowRenderer.getMountedInstance();
908
+ mountedInstance.setState({foo: 'bar'}, () => mockFn());
909
+ expect(mockFn.mock.calls.length).toBe(3);
910
+ });
911
+
912
+ it('should call the setState callback even if shouldComponentUpdate = false', done => {
913
+ const mockFn = jest.fn().mockReturnValue(false);
914
+
915
+ class Component extends React.Component {
916
+ constructor(props, context) {
917
+ super(props, context);
918
+ this.state = {
919
+ hasUpdatedState: false,
920
+ };
921
+ }
922
+
923
+ shouldComponentUpdate() {
924
+ return mockFn();
925
+ }
926
+
927
+ render() {
928
+ return <div>{this.state.hasUpdatedState}</div>;
929
+ }
930
+ }
931
+
932
+ const shallowRenderer = createRenderer();
933
+ shallowRenderer.render(<Component />);
934
+
935
+ const mountedInstance = shallowRenderer.getMountedInstance();
936
+ mountedInstance.setState({hasUpdatedState: true}, () => {
937
+ expect(mockFn).toBeCalled();
938
+ expect(mountedInstance.state.hasUpdatedState).toBe(true);
939
+ done();
940
+ });
941
+ });
942
+
943
it('throws usefully when rendering badly-typed elements', () => {
944
spyOnDev(console, 'error');
945
const shallowRenderer = createRenderer();