diff --git a/packages/react-test-renderer/src/ReactShallowRenderer.js b/packages/react-test-renderer/src/ReactShallowRenderer.js
index 8f64bef8e0..28af0edb36 100644
--- a/packages/react-test-renderer/src/ReactShallowRenderer.js
+++ b/packages/react-test-renderer/src/ReactShallowRenderer.js
@@ -47,6 +47,7 @@ class ReactShallowRenderer {
'it by passing it to React.createElement.'
: '',
);
+ // Show a special message for host elements since it's a common case.
invariant(
typeof element.type !== 'string',
'ReactShallowRenderer render(): Shallow rendering works only with custom ' +
@@ -54,6 +55,14 @@ class ReactShallowRenderer {
'inspecting the rendered output, look at `el.props` directly instead.',
element.type,
);
+ invariant(
+ typeof element.type === 'function',
+ 'ReactShallowRenderer render(): Shallow rendering works only with custom ' +
+ 'components, but the provided element type was `%s`.',
+ Array.isArray(element.type)
+ ? 'array'
+ : element.type === null ? 'null' : typeof element.type,
+ );
if (this._rendering) {
return;
@@ -144,12 +153,8 @@ class ReactShallowRenderer {
) {
this._instance.componentWillReceiveProps(props, context);
}
-
// Read state after cWRP in case it calls setState
- // Fallback to previous instance state to support rendering React.cloneElement()
- // TODO: the cloneElement() use case is broken and should be removed
- // https://github.com/facebook/react/issues/11441
- const state = this._newState || this._instance.state || emptyObject;
+ const state = this._newState || oldState;
let shouldUpdate = true;
if (this._forcedUpdate) {
@@ -161,9 +166,7 @@ class ReactShallowRenderer {
state,
context,
);
- } else if (type && type.prototype && type.prototype.isPureReactComponent) {
- // TODO: we can remove the type existence check when we fix this:
- // https://github.com/facebook/react/issues/11441
+ } else if (type.prototype && type.prototype.isPureReactComponent) {
shouldUpdate =
!shallowEqual(oldProps, props) || !shallowEqual(oldState, state);
}
diff --git a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js
index 7bd5cf159c..f7aa3168f4 100644
--- a/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js
+++ b/packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js
@@ -844,12 +844,44 @@ describe('ReactShallowRenderer', () => {
}
const shallowRenderer = createRenderer();
- let result = shallowRenderer.render(