diff --git a/packages/react-dom/src/__tests__/ReactCompositeComponent-test.js b/packages/react-dom/src/__tests__/ReactCompositeComponent-test.js index 75f3e8060f384..94826f96559f9 100644 --- a/packages/react-dom/src/__tests__/ReactCompositeComponent-test.js +++ b/packages/react-dom/src/__tests__/ReactCompositeComponent-test.js @@ -1500,4 +1500,43 @@ describe('ReactCompositeComponent', () => { ReactTestUtils.renderIntoDocument(); expect(mockArgs.length).toEqual(0); }); + + it('should return a meaningful warning when constructor is returned', () => { + spyOn(console, 'error'); + class RenderTextInvalidConstructor extends React.Component { + constructor(props) { + super(props); + return {something: false}; + } + + render() { + return
; + } + } + + expect(function() { + ReactTestUtils.renderIntoDocument(); + }).toThrow(); + + expectDev(console.error.calls.count()).toBe(1); + expectDev(console.error.calls.mostRecent().args[0]).toBe( + 'Warning: RenderTextInvalidConstructor(...): No `render` method found on the returned component instance: ' + + 'did you accidentally return an object from the constructor?', + ); + }); + + it('should return error if render is not defined', () => { + spyOn(console, 'error'); + class RenderTestUndefinedRender extends React.Component {} + + expect(function() { + ReactTestUtils.renderIntoDocument(); + }).toThrow(); + + expectDev(console.error.calls.count()).toBe(1); + expectDev(console.error.calls.mostRecent().args[0]).toBe( + 'Warning: RenderTestUndefinedRender(...): No `render` method found on the returned ' + + 'component instance: you may have forgotten to define `render`.', + ); + }); }); diff --git a/packages/react-reconciler/src/ReactFiberClassComponent.js b/packages/react-reconciler/src/ReactFiberClassComponent.js index 396be01fb8ab0..bd0363f822b97 100644 --- a/packages/react-reconciler/src/ReactFiberClassComponent.js +++ b/packages/react-reconciler/src/ReactFiberClassComponent.js @@ -201,12 +201,25 @@ module.exports = function( if (__DEV__) { const name = getComponentName(workInProgress); const renderPresent = instance.render; - warning( - renderPresent, - '%s(...): No `render` method found on the returned component ' + - 'instance: you may have forgotten to define `render`.', - name, - ); + + if (!renderPresent) { + if (type.prototype && typeof type.prototype.render === 'function') { + warning( + false, + '%s(...): No `render` method found on the returned component ' + + 'instance: did you accidentally return an object from the constructor?', + name, + ); + } else { + warning( + false, + '%s(...): No `render` method found on the returned component ' + + 'instance: you may have forgotten to define `render`.', + name, + ); + } + } + const noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved ||