diff --git a/src/core/__tests__/ReactComponentLifeCycle-test.js b/src/core/__tests__/ReactComponentLifeCycle-test.js index a3c18be304..3f2df5e82e 100644 --- a/src/core/__tests__/ReactComponentLifeCycle-test.js +++ b/src/core/__tests__/ReactComponentLifeCycle-test.js @@ -434,5 +434,69 @@ describe('ReactComponentLifeCycle', function() { expect(instance.state.stateField).toBe('goodbye'); }); + it('should call nested lifecycle methods in the right order', function() { + var log; + var logger = function(msg) { + return function() { + // return true for shouldComponentUpdate + log.push(msg); + return true; + }; + }; + var Outer = React.createClass({ + render: function() { + return
; + }, + componentWillMount: logger('outer componentWillMount'), + componentDidMount: logger('outer componentDidMount'), + componentWillReceiveProps: logger('outer componentWillReceiveProps'), + shouldComponentUpdate: logger('outer shouldComponentUpdate'), + componentWillUpdate: logger('outer componentWillUpdate'), + componentDidUpdate: logger('outer componentDidUpdate'), + componentWillUnmount: logger('outer componentWillUnmount') + }); + var Inner = React.createClass({ + render: function() { + return {this.props.x}; + }, + componentWillMount: logger('inner componentWillMount'), + componentDidMount: logger('inner componentDidMount'), + componentWillReceiveProps: logger('inner componentWillReceiveProps'), + shouldComponentUpdate: logger('inner shouldComponentUpdate'), + componentWillUpdate: logger('inner componentWillUpdate'), + componentDidUpdate: logger('inner componentDidUpdate'), + componentWillUnmount: logger('inner componentWillUnmount') + }); + var instance; + + log = []; + instance = ReactTestUtils.renderIntoDocument(); + expect(log).toEqual([ + 'outer componentWillMount', + 'inner componentWillMount', + 'inner componentDidMount', + 'outer componentDidMount' + ]); + + log = []; + instance.setProps({x: 42}); + expect(log).toEqual([ + 'outer componentWillReceiveProps', + 'outer shouldComponentUpdate', + 'outer componentWillUpdate', + 'inner componentWillReceiveProps', + 'inner shouldComponentUpdate', + 'inner componentWillUpdate', + 'inner componentDidUpdate', + 'outer componentDidUpdate' + ]); + + log = []; + instance.unmountComponent(); + expect(log).toEqual([ + 'outer componentWillUnmount', + 'inner componentWillUnmount' + ]); + }); });