From 7bd51659d672c29f355f2c2f4e38d34fb450ca3a Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Wed, 30 Sep 2015 16:00:21 -0700 Subject: [PATCH] Make scry* look through stateless components Fixes #4882. --- src/test/ReactTestUtils.js | 9 +++++++-- src/test/__tests__/ReactTestUtils-test.js | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/test/ReactTestUtils.js b/src/test/ReactTestUtils.js index 102816fbb88b..1dbe54ff732d 100644 --- a/src/test/ReactTestUtils.js +++ b/src/test/ReactTestUtils.js @@ -44,6 +44,7 @@ function findAllInRenderedTreeInternal(inst, test) { } var publicInst = inst.getPublicInstance(); var ret = test(publicInst) ? [publicInst] : []; + var currentElement = inst._currentElement; if (ReactTestUtils.isDOMComponent(publicInst)) { var renderedChildren = inst._renderedChildren; var key; @@ -58,7 +59,10 @@ function findAllInRenderedTreeInternal(inst, test) { ) ); } - } else if (ReactTestUtils.isCompositeComponent(publicInst)) { + } else if ( + ReactElement.isValidElement(currentElement) && + typeof currentElement.type === 'function' + ) { ret = ret.concat( findAllInRenderedTreeInternal(inst._renderedComponent, test) ); @@ -111,7 +115,8 @@ var ReactTestUtils = { // this returns when we have DOM nodes as refs directly return false; } - return typeof inst.render === 'function' && + return inst != null && + typeof inst.render === 'function' && typeof inst.setState === 'function'; }, diff --git a/src/test/__tests__/ReactTestUtils-test.js b/src/test/__tests__/ReactTestUtils-test.js index 9e890629af61..0b438cd7cb3c 100644 --- a/src/test/__tests__/ReactTestUtils-test.js +++ b/src/test/__tests__/ReactTestUtils-test.js @@ -410,4 +410,22 @@ describe('ReactTestUtils', function() { expect(handler).toHaveBeenCalledWith(jasmine.objectContaining({target: node})); }); + it('can scry with stateless components involved', function() { + var Stateless = () =>

; + var SomeComponent = React.createClass({ + render: function() { + return ( +
+ +
+
+ ); + }, + }); + + var inst = ReactTestUtils.renderIntoDocument(); + var hrs = ReactTestUtils.scryRenderedDOMComponentsWithTag(inst, 'hr'); + expect(hrs.length).toBe(2); + }); + });