From 43c32d99bb1e65e329337cddaad8e53461ca1dde Mon Sep 17 00:00:00 2001 From: cyan33 Date: Wed, 20 Jun 2018 10:49:21 -0700 Subject: [PATCH] fix find forwardRef itself --- .../enzyme-test-suite/test/ReactWrapper-spec.jsx | 15 +++++++++++++++ packages/enzyme/src/selectors.js | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx index df6722cbf..f285be0da 100644 --- a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx @@ -210,6 +210,21 @@ describeWithDOM('mount', () => { expect(wrapper.find('.child2')).to.have.length(1); }); + + it('should find the forwardRef element itself', () => { + const testRef = () => {}; + const OtherComponent = () => ( +
+ ); + const SomeComponent = forwardRef((props, ref) => ( + + )); + + const wrapper = mount(
); + + expect(wrapper.find(SomeComponent)).to.have.length(1); + expect(wrapper.find(OtherComponent)).to.have.length(1); + }); }); describeIf(!REACT013, 'stateless components', () => { diff --git a/packages/enzyme/src/selectors.js b/packages/enzyme/src/selectors.js index 8342dde1a..358f056e7 100644 --- a/packages/enzyme/src/selectors.js +++ b/packages/enzyme/src/selectors.js @@ -13,7 +13,7 @@ import { childrenOfNode, hasClassName, } from './RSTTraversal'; -import { nodeHasType, propsOfNode } from './Utils'; +import { nodeHasType, propsOfNode, typeOf, ForwardRef } from './Utils'; // our CSS selector parser instance const parser = createParser(); @@ -227,6 +227,12 @@ export function buildPredicate(selector) { if (hasUndefinedValues) { throw new TypeError('Enzyme::Props can’t have `undefined` values. Try using ‘findWhere()’ instead.'); } + // the selector could also be a forwardRef + if (typeOf(selector) === ForwardRef) { + // re-build the predicate based on what is wrapped by forwardRef + // rather than the forwardRef itself + return buildPredicate(selector.render().props); + } return node => nodeMatchesObjectProps(node, selector); } throw new TypeError('Enzyme::Selector does not support an array, null, or empty object as a selector');