From c1330dcfcd7f9bf9f850cbfd53b738bfbf8b13d6 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Thu, 18 Jun 2015 22:55:52 -0700 Subject: [PATCH] Unit tests for unmounted setState and isMounted --- .../__tests__/ReactComponentLifeCycle-test.js | 26 +++++++++++++++++++ .../__tests__/ReactCompositeComponent-test.js | 11 ++++++++ 2 files changed, 37 insertions(+) diff --git a/src/renderers/shared/reconciler/__tests__/ReactComponentLifeCycle-test.js b/src/renderers/shared/reconciler/__tests__/ReactComponentLifeCycle-test.js index 63069d8f84..0a5a6b2993 100644 --- a/src/renderers/shared/reconciler/__tests__/ReactComponentLifeCycle-test.js +++ b/src/renderers/shared/reconciler/__tests__/ReactComponentLifeCycle-test.js @@ -257,6 +257,32 @@ describe('ReactComponentLifeCycle', function() { ); }); + it('should correctly determine if a null component is mounted', function() { + spyOn(console, 'error'); + var Component = React.createClass({ + componentWillMount: function() { + expect(this.isMounted()).toBeFalsy(); + }, + componentDidMount: function() { + expect(this.isMounted()).toBeTruthy(); + }, + render: function() { + expect(this.isMounted()).toBeFalsy(); + return null; + }, + }); + + var element = ; + + var instance = ReactTestUtils.renderIntoDocument(element); + expect(instance.isMounted()).toBeTruthy(); + + expect(console.error.argsForCall.length).toBe(1); + expect(console.error.argsForCall[0][0]).toContain( + 'Component is accessing isMounted inside its render()' + ); + }); + it('isMounted should return false when unmounted', function () { var Component = React.createClass({ render: function() { diff --git a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js index 8b4c1b8963..15a56b60da 100644 --- a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js +++ b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js @@ -286,11 +286,14 @@ describe('ReactCompositeComponent', function() { var container = document.createElement('div'); document.body.appendChild(container); + var renders = 0; + var Component = React.createClass({ getInitialState: function() { return {value: 0}; }, render: function() { + renders++; return
; }, }); @@ -299,12 +302,20 @@ describe('ReactCompositeComponent', function() { expect(instance.setState).not.toBeDefined(); instance = React.render(instance, container); + + expect(renders).toBe(1); + instance.setState({value: 1}); expect(console.error.calls.length).toBe(0); + expect(renders).toBe(2); + React.unmountComponentAtNode(container); instance.setState({value: 2}); + + expect(renders).toBe(2); + expect(console.error.calls.length).toBe(1); expect(console.error.argsForCall[0][0]).toBe( 'Warning: setState(...): Can only update a mounted or ' +