Skip to content

Commit 50f2262

Browse files
committed
Throw away old shallow renderer state on type change
This worked in function components but was broken for classes. It incorrectly retained the old instance even if the type was different.
1 parent b283d75 commit 50f2262

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

packages/react-test-renderer/src/ReactShallowRenderer.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ class ReactShallowRenderer {
178178
};
179179

180180
constructor() {
181+
this._reset();
182+
}
183+
184+
_reset() {
181185
this._context = null;
182186
this._element = null;
183187
this._instance = null;
@@ -514,6 +518,9 @@ class ReactShallowRenderer {
514518
if (this._rendering) {
515519
return;
516520
}
521+
if (this._element != null && this._element.type !== element.type) {
522+
this._reset();
523+
}
517524

518525
const elementType = isMemo(element.type) ? element.type.type : element.type;
519526
const previousElement = this._element;

packages/react-test-renderer/src/__tests__/ReactShallowRenderer-test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,4 +1565,46 @@ describe('ReactShallowRenderer', () => {
15651565
'forwardRef requires a render function but was given object.',
15661566
);
15671567
});
1568+
1569+
it('should let you change type', () => {
1570+
function Foo({prop}) {
1571+
return <div>Foo {prop}</div>;
1572+
}
1573+
function Bar({prop}) {
1574+
return <div>Bar {prop}</div>;
1575+
}
1576+
1577+
const shallowRenderer = createRenderer();
1578+
shallowRenderer.render(<Foo prop="foo1" />);
1579+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Foo {'foo1'}</div>);
1580+
shallowRenderer.render(<Foo prop="foo2" />);
1581+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Foo {'foo2'}</div>);
1582+
shallowRenderer.render(<Bar prop="bar1" />);
1583+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Bar {'bar1'}</div>);
1584+
shallowRenderer.render(<Bar prop="bar2" />);
1585+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Bar {'bar2'}</div>);
1586+
});
1587+
1588+
it('should let you change class type', () => {
1589+
class Foo extends React.Component {
1590+
render() {
1591+
return <div>Foo {this.props.prop}</div>;
1592+
}
1593+
}
1594+
class Bar extends React.Component {
1595+
render() {
1596+
return <div>Bar {this.props.prop}</div>;
1597+
}
1598+
}
1599+
1600+
const shallowRenderer = createRenderer();
1601+
shallowRenderer.render(<Foo prop="foo1" />);
1602+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Foo {'foo1'}</div>);
1603+
shallowRenderer.render(<Foo prop="foo2" />);
1604+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Foo {'foo2'}</div>);
1605+
shallowRenderer.render(<Bar prop="bar1" />);
1606+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Bar {'bar1'}</div>);
1607+
shallowRenderer.render(<Bar prop="bar2" />);
1608+
expect(shallowRenderer.getRenderOutput()).toEqual(<div>Bar {'bar2'}</div>);
1609+
});
15681610
});

0 commit comments

Comments
 (0)