diff --git a/src/test/ReactTestUtils.js b/src/test/ReactTestUtils.js index 64b39fe5e3403..40af0e51300de 100644 --- a/src/test/ReactTestUtils.js +++ b/src/test/ReactTestUtils.js @@ -375,10 +375,32 @@ ReactShallowRenderer.prototype.getMountedInstance = function() { }; var NoopInternalComponent = function(element) { - this._renderedOutput = element; + if (element && element.props && element.props.children) { + var children = NoopInternalChildren(element.props.children); + var props = assign({}, element.props, { children: children }); + this._renderedOutput = assign({}, element, { props: props }); + } else { + this._renderedOutput = element; + } this._currentElement = element; }; +var NoopInternalChildren = function(children) { + if (Array.isArray(children)) { + return children.map(NoopInternalChildren); + } else if (children === Object(children)) { + return NoopInternalChild(children); + } + return children; +}; + +var NoopInternalChild = function(child) { + var props = child.props && child.props.children ? assign({}, child.props, { + children: NoopInternalChildren(child.props.children), + }) : child.props; + return assign({}, child, { _owner: null }, { props: props }); +}; + NoopInternalComponent.prototype = { mountComponent: function() { diff --git a/src/test/__tests__/ReactTestUtils-test.js b/src/test/__tests__/ReactTestUtils-test.js index 9bbbdb56088d5..5f39c0d3c9be1 100644 --- a/src/test/__tests__/ReactTestUtils-test.js +++ b/src/test/__tests__/ReactTestUtils-test.js @@ -209,6 +209,44 @@ describe('ReactTestUtils', function() { expect(result).toEqual(
foo
); }); + it('can shallow render components with stateful children', function() { + var Component = React.createClass({ + getInitialState: function() { + return { + body: ( + + ), + }; + }, + + render: function() { + return ( +
+ {this.state.body} +
+ ); + }, + }); + + var shallowRenderer = ReactTestUtils.createRenderer(); + shallowRenderer.render(); + var result = shallowRenderer.getRenderOutput(); + + expect(result).toEqual( +
+ +
+ ); + }); + it('can scryRenderedDOMComponentsWithClass with TextComponent', function() { var Wrapper = React.createClass({ render: function() {