test: Add regression test for hooks after error boundaries (#20002)
* test: Add regression test for hooks after error boundaries * fix lint
Sebastian Silbermann committed
Oct 16, 2020 at 17:07 UTC
b093528650db32b0112eb3adfcf9867e5f3b56d0
1 file changed
+66
packages/react-dom/src/__tests__/ReactErrorBoundariesHooks-test.internal.js
new
+66
@@ -0,0 +1,66 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails react-core
8
+ */
9
+
10
+'use strict';
11
+
12
+let React;
13
+let ReactDOM;
14
+
15
+describe('ReactErrorBoundariesHooks', () => {
16
+ beforeEach(() => {
17
+ jest.resetModules();
18
+ ReactDOM = require('react-dom');
19
+ React = require('react');
20
+ });
21
+
22
+ it('should preserve hook order if errors are caught', () => {
23
+ function ErrorThrower() {
24
+ React.useMemo(() => undefined, []);
25
+ throw new Error('expected');
26
+ }
27
+
28
+ function StatefulComponent() {
29
+ React.useState(null);
30
+ return ' | stateful';
31
+ }
32
+
33
+ class ErrorHandler extends React.Component {
34
+ state = {error: null};
35
+
36
+ componentDidCatch(error) {
37
+ return this.setState({error});
38
+ }
39
+
40
+ render() {
41
+ if (this.state.error !== null) {
42
+ return <p>Handled error: {this.state.error.message}</p>;
43
+ }
44
+ return this.props.children;
45
+ }
46
+ }
47
+
48
+ function App(props) {
49
+ return (
50
+ <React.Fragment>
51
+ <ErrorHandler>
52
+ <ErrorThrower />
53
+ </ErrorHandler>
54
+ <StatefulComponent />
55
+ </React.Fragment>
56
+ );
57
+ }
58
+
59
+ const container = document.createElement('div');
60
+ ReactDOM.render(<App />, container);
61
+
62
+ expect(() => {
63
+ ReactDOM.render(<App />, container);
64
+ }).not.toThrow();
65
+ });
66
+});