[Fiber] Miscellaneous fixes to get more tests passing (#8151)

* Reset current owner when handling an error

* Make string ref deletion tests accept null

* Relax requirements on ref and render interleaving
This commit is contained in:
Dan Abramov authored and GitHub committed 2016-10-30 22:15:34 +00:00
1 parent c567b6e618
commit 264bed13ba
3 files changed
+39 -10

No files matched your search

@@ -555,6 +555,8 @@ module.exports = function<T, P, I, TI, C>(config : HostConfig<T, P, I, TI, C>) {
});
}
ReactCurrentOwner.current = null;
// Surface the first error uncaught by the boundaries to the user.
if (firstUncaughtError) {
// We need to make sure any future root can get scheduled despite these errors.
@@ -13,12 +13,14 @@
var React;
var ReactDOM;
var ReactDOMFeatureFlags;
var ReactTestUtils;
describe('ReactComponent', () => {
beforeEach(() => {
React = require('React');
ReactDOM = require('ReactDOM');
ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
ReactTestUtils = require('ReactTestUtils');
});
@@ -195,7 +197,7 @@ describe('ReactComponent', () => {
getInner = () => {
// (With old-style refs, it's impossible to get a ref to this div
// because Wrapper is the current owner when this function is called.)
return <div title="inner" ref={(c) => this.innerRef = c} />;
return <div className="inner" ref={(c) => this.innerRef = c} />;
};
render() {
@@ -211,7 +213,7 @@ describe('ReactComponent', () => {
componentDidMount() {
// Check .props.title to make sure we got the right elements back
expect(this.wrapperRef.getTitle()).toBe('wrapper');
expect(ReactDOM.findDOMNode(this.innerRef).title).toBe('inner');
expect(ReactDOM.findDOMNode(this.innerRef).className).toBe('inner');
mounted = true;
}
}
@@ -291,10 +293,19 @@ describe('ReactComponent', () => {
'outer componentDidMount',
'start update',
// Previous (equivalent) refs get cleared
'ref 1 got null',
'inner 1 render',
'ref 2 got null',
'inner 2 render',
...(ReactDOMFeatureFlags.useFiber ? [
// Fiber renders first, resets refs later
'inner 1 render',
'inner 2 render',
'ref 1 got null',
'ref 2 got null',
] : [
// Stack resets refs before rendering
'ref 1 got null',
'inner 1 render',
'ref 2 got null',
'inner 2 render',
]),
'inner 1 componentDidUpdate',
'ref 1 got instance 1',
'inner 2 componentDidUpdate',
@@ -45,9 +45,17 @@ describe('refs-destruction', () => {
var testInstance = ReactDOM.render(<TestComponent />, container);
expect(ReactTestUtils.isDOMComponent(testInstance.refs.theInnerDiv))
.toBe(true);
expect(Object.keys(testInstance.refs || {}).length).toEqual(1);
expect(
Object.keys(testInstance.refs || {})
.filter(key => testInstance.refs[key])
.length
).toEqual(1);
ReactDOM.unmountComponentAtNode(container);
expect(Object.keys(testInstance.refs || {}).length).toEqual(0);
expect(
Object.keys(testInstance.refs || {})
.filter(key => testInstance.refs[key])
.length
).toEqual(0);
});
it('should remove refs when destroying the child', () => {
@@ -55,9 +63,17 @@ describe('refs-destruction', () => {
var testInstance = ReactDOM.render(<TestComponent />, container);
expect(ReactTestUtils.isDOMComponent(testInstance.refs.theInnerDiv))
.toBe(true);
expect(Object.keys(testInstance.refs || {}).length).toEqual(1);
expect(
Object.keys(testInstance.refs || {})
.filter(key => testInstance.refs[key])
.length
).toEqual(1);
ReactDOM.render(<TestComponent destroy={true} />, container);
expect(Object.keys(testInstance.refs || {}).length).toEqual(0);
expect(
Object.keys(testInstance.refs || {})
.filter(key => testInstance.refs[key])
.length
).toEqual(0);
});
it('should not error when destroying child with ref asynchronously', () => {