diff --git a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx index cc3c97d23..d029e0083 100644 --- a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx @@ -5399,6 +5399,27 @@ describeWithDOM('mount', () => { ); + class ClassChild extends React.Component { + render() { + return
Class child
; + } + } + + function SFCChild() { + return
SFC child
; + } + + class FragmentWithCustomChildClass extends React.Component { + render() { + return ( + + + + + ); + } + } + it('correctly renders html for both children for class', () => { const classWrapper = mount(); expect(classWrapper.html()).to.equal('
Foo
Bar
'); @@ -5408,6 +5429,11 @@ describeWithDOM('mount', () => { const constWrapper = mount(); expect(constWrapper.html()).to.equal('
Foo
Bar
'); }); + + it('correctly renders html for custom component children', () => { + const withChildrenWrapper = mount(); + expect(withChildrenWrapper.html()).to.equal('
Class child
SFC child
'); + }); }); }); diff --git a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx index b20b598f0..245aa41f0 100644 --- a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx @@ -5487,6 +5487,27 @@ describe('shallow', () => { ); + class ClassChild extends React.Component { + render() { + return
Class child
; + } + } + + function SFCChild() { + return
SFC child
; + } + + class FragmentWithCustomChildClass extends React.Component { + render() { + return ( + + + + + ); + } + } + it('correctly renders html for both children for class', () => { const classWrapper = shallow(); expect(classWrapper.html()).to.equal('
Foo
Bar
'); @@ -5496,6 +5517,11 @@ describe('shallow', () => { const constWrapper = shallow(); expect(constWrapper.html()).to.equal('
Foo
Bar
'); }); + + it('correctly renders html for custom component children', () => { + const withChildrenWrapper = shallow(); + expect(withChildrenWrapper.html()).to.equal('
Class child
SFC child
'); + }); }); }); diff --git a/packages/enzyme/src/RSTTraversal.js b/packages/enzyme/src/RSTTraversal.js index 7d5597fd5..52c1f29e9 100644 --- a/packages/enzyme/src/RSTTraversal.js +++ b/packages/enzyme/src/RSTTraversal.js @@ -142,6 +142,7 @@ function getTextFromRSTNode(node, { getCustom, handleHostNodes, recurse, + nullRenderReturnsNull = false, }) { if (node == null) { return ''; @@ -158,6 +159,9 @@ function getTextFromRSTNode(node, { if (handleHostNodes && node.nodeType === 'host') { return handleHostNodes(node); } + if (node.rendered == null && nullRenderReturnsNull) { + return null; + } return childrenOfNode(node).map(recurse).join(''); } @@ -190,13 +194,14 @@ function getHTMLFromHostNode(hostNode) { } export function getHTMLFromHostNodes(node, adapter) { - if (node === null) return null; - - const hostNode = adapter.nodeToHostNode(node, true); - if (hostNode === null) return null; - - const nodeArray = Array.isArray(hostNode) ? hostNode : [hostNode]; - const nodesHTML = nodeArray.map(item => getHTMLFromHostNode(item)); - - return nodesHTML.join(''); + return getTextFromRSTNode(node, { + recurse(item) { + return getHTMLFromHostNodes(item, adapter); + }, + handleHostNodes(item) { + const nodes = [].concat(adapter.nodeToHostNode(item, true)); + return nodes.map(getHTMLFromHostNode).join(''); + }, + nullRenderReturnsNull: true, + }); }