. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in NoKey (at **)',
+ ]);
+ }
});
// @gate !__DEV__ || enableOwnerStacks
it('should warn in DEV a child is missing keys on a fragment', () => {
- expect(() => {
- // While we're on the server we need to have the Server version active to track component stacks.
- jest.resetModules();
- jest.mock('react', () => ReactServer);
- const transport = ReactNoopFlightServer.render(
- ReactServer.createElement(
- 'div',
- null,
- Array(6).fill(ReactServer.createElement(ReactServer.Fragment)),
- ),
- );
- jest.resetModules();
- jest.mock('react', () => React);
- ReactNoopFlightClient.read(transport);
- }).toErrorDev('Each child in a list should have a unique "key" prop.');
+ // While we're on the server we need to have the Server version active to track component stacks.
+ jest.resetModules();
+ jest.mock('react', () => ReactServer);
+ const transport = ReactNoopFlightServer.render(
+ ReactServer.createElement(
+ 'div',
+ null,
+ Array(6).fill(ReactServer.createElement(ReactServer.Fragment)),
+ ),
+ );
+ jest.resetModules();
+ jest.mock('react', () => React);
+ ReactNoopFlightClient.read(transport);
+ if (gate(flags => flags.enableOwnerStacks)) {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in Fragment (at **)',
+ 'Each child in a list should have a unique "key" prop. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in Fragment (at **)',
+ ]);
+ } else {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop.\n\n' +
+ 'Check the top-level render call using
. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in Fragment (at **)',
+ ]);
+ }
});
it('should warn in DEV a child is missing keys in client component', async () => {
function ParentClient({children}) {
return children;
}
- const Parent = clientReference(ParentClient);
- await expect(async () => {
+
+ await act(async () => {
+ const Parent = clientReference(ParentClient);
const transport = ReactNoopFlightServer.render(
{Array(6).fill(no key
)},
);
ReactNoopFlightClient.read(transport);
- await act(async () => {
- ReactNoop.render(await ReactNoopFlightClient.read(transport));
- });
- }).toErrorDev(
- gate(flags => flags.enableOwnerStacks)
- ? 'Each child in a list should have a unique "key" prop.' +
- '\n\nCheck the top-level render call using
. ' +
- 'See https://react.dev/link/warning-keys for more information.'
- : 'Each child in a list should have a unique "key" prop. ' +
- 'See https://react.dev/link/warning-keys for more information.',
- );
+
+ ReactNoop.render(await ReactNoopFlightClient.read(transport));
+ });
+ if (gate(flags => flags.enableOwnerStacks)) {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop.\n\n' +
+ 'Check the top-level render call using . ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in div (at **)',
+ ]);
+ } else {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in div (at **)',
+ ]);
+ }
});
it('should error if a class instance is passed to a host component', () => {
@@ -3135,19 +3445,17 @@ describe('ReactFlight', () => {
},
);
- let transport;
- expect(() => {
- // Reset the modules so that we get a new overridden console on top of the
- // one installed by expect. This ensures that we still emit console.error
- // calls.
- jest.resetModules();
- jest.mock('react', () => require('react/react.react-server'));
- ReactServer = require('react');
- ReactNoopFlightServer = require('react-noop-renderer/flight-server');
- transport = ReactNoopFlightServer.render({
- root: ReactServer.createElement(App),
- });
- }).toErrorDev('err');
+ // Reset the modules so that we get a new overridden console on top of the
+ // one installed by expect. This ensures that we still emit console.error
+ // calls.
+ jest.resetModules();
+ jest.mock('react', () => require('react/react.react-server'));
+ ReactServer = require('react');
+ ReactNoopFlightServer = require('react-noop-renderer/flight-server');
+ const transport = ReactNoopFlightServer.render({
+ root: ReactServer.createElement(App),
+ });
+ assertConsoleErrorDev(['Error: err']);
expect(mockConsoleLog).toHaveBeenCalledTimes(1);
expect(mockConsoleLog.mock.calls[0][0]).toBe('hi');
diff --git a/packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.js b/packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.js
index ff8e7e1ac8683..87f98b99f2534 100644
--- a/packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.js
+++ b/packages/react-debug-tools/src/__tests__/ReactHooksInspectionIntegration-test.js
@@ -14,6 +14,7 @@ let React;
let ReactTestRenderer;
let ReactDebugTools;
let act;
+let assertConsoleErrorDev;
let useMemoCache;
function normalizeSourceLoc(tree) {
@@ -33,7 +34,7 @@ describe('ReactHooksInspectionIntegration', () => {
jest.resetModules();
React = require('react');
ReactTestRenderer = require('react-test-renderer');
- act = require('internal-test-utils').act;
+ ({act, assertConsoleErrorDev} = require('internal-test-utils'));
ReactDebugTools = require('react-debug-tools');
useMemoCache = require('react/compiler-runtime').c;
});
@@ -2344,10 +2345,12 @@ describe('ReactHooksInspectionIntegration', () => {
,
);
- await expect(async () => {
- await act(async () => await LazyFoo);
- }).toErrorDev([
- 'Foo: Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead.',
+ await act(async () => await LazyFoo);
+ assertConsoleErrorDev([
+ 'Foo: Support for defaultProps will be removed from function components in a future major release. Use JavaScript default parameters instead.' +
+ (gate(flags => flags.enableOwnerStacks)
+ ? ''
+ : '\n in Foo (at **)\n' + ' in Suspense (at **)'),
]);
const childFiber = renderer.root._currentFiber();
diff --git a/packages/react-dom/src/client/__tests__/trustedTypes-test.internal.js b/packages/react-dom/src/client/__tests__/trustedTypes-test.internal.js
index 923ee1f5d81a6..5a43a9ec2f06c 100644
--- a/packages/react-dom/src/client/__tests__/trustedTypes-test.internal.js
+++ b/packages/react-dom/src/client/__tests__/trustedTypes-test.internal.js
@@ -14,6 +14,7 @@ describe('when Trusted Types are available in global object', () => {
let ReactDOMClient;
let ReactFeatureFlags;
let act;
+ let assertConsoleErrorDev;
let container;
let ttObject1;
let ttObject2;
@@ -36,7 +37,7 @@ describe('when Trusted Types are available in global object', () => {
ReactFeatureFlags.enableTrustedTypesIntegration = true;
React = require('react');
ReactDOMClient = require('react-dom/client');
- act = require('internal-test-utils').act;
+ ({act, assertConsoleErrorDev} = require('internal-test-utils'));
ttObject1 = {
toString() {
return 'Hi';
@@ -208,17 +209,16 @@ describe('when Trusted Types are available in global object', () => {
it('should warn once when rendering script tag in jsx on client', async () => {
const root = ReactDOMClient.createRoot(container);
- await expect(async () => {
- await act(() => {
- root.render();
- });
- }).toErrorDev(
+ await act(() => {
+ root.render();
+ });
+ assertConsoleErrorDev([
'Encountered a script tag while rendering React component. ' +
'Scripts inside React components are never executed when rendering ' +
'on the client. Consider using template tag instead ' +
'(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template).\n' +
' in script (at **)',
- );
+ ]);
// check that the warning is printed only once
await act(() => {
diff --git a/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js
index 03f0cd0a6c0f3..05116be30110f 100644
--- a/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js
+++ b/packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js
@@ -16,6 +16,7 @@ let ReactNativePrivateInterface;
let createReactNativeComponentClass;
let StrictMode;
let act;
+let assertConsoleErrorDev;
const DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT =
"dispatchCommand was called with a ref that isn't a " +
@@ -38,7 +39,7 @@ describe('ReactFabric', () => {
createReactNativeComponentClass =
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface')
.ReactNativeViewConfigRegistry.register;
- act = require('internal-test-utils').act;
+ ({act, assertConsoleErrorDev} = require('internal-test-utils'));
});
it('should be able to create and render a native component', async () => {
@@ -459,9 +460,8 @@ describe('ReactFabric', () => {
});
expect(nativeFabricUIManager.dispatchCommand).not.toBeCalled();
- expect(() => {
- ReactFabric.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
- }).toErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
+ ReactFabric.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
+ assertConsoleErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
withoutStack: true,
});
@@ -525,9 +525,8 @@ describe('ReactFabric', () => {
});
expect(nativeFabricUIManager.sendAccessibilityEvent).not.toBeCalled();
- expect(() => {
- ReactFabric.sendAccessibilityEvent(viewRef, 'eventTypeName');
- }).toErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
+ ReactFabric.sendAccessibilityEvent(viewRef, 'eventTypeName');
+ assertConsoleErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
withoutStack: true,
});
@@ -856,24 +855,31 @@ describe('ReactFabric', () => {
uiViewClassName: 'RCTView',
}));
- await expect(async () => {
- await act(() => {
- ReactFabric.render(this should warn, 11, null, true);
- });
- }).toErrorDev(['Text strings must be rendered within a component.']);
+ await act(() => {
+ ReactFabric.render(this should warn, 11, null, true);
+ });
+ assertConsoleErrorDev([
+ 'Text strings must be rendered within a component.\n' +
+ ' in RCTView (at **)',
+ ]);
- await expect(async () => {
- await act(() => {
- ReactFabric.render(
-
- hi hello hi
- ,
- 11,
- null,
- true,
- );
- });
- }).toErrorDev(['Text strings must be rendered within a component.']);
+ await act(() => {
+ ReactFabric.render(
+
+ hi hello hi
+ ,
+ 11,
+ null,
+ true,
+ );
+ });
+ assertConsoleErrorDev([
+ 'Text strings must be rendered within a component.\n' +
+ ' in RCTScrollView (at **)' +
+ (gate(flags => !flags.enableOwnerStacks)
+ ? '\n in RCTText (at **)'
+ : ''),
+ ]);
});
it('should not throw for text inside of an indirect ancestor', async () => {
@@ -1166,10 +1172,8 @@ describe('ReactFabric', () => {
);
});
- let match;
- expect(
- () => (match = ReactFabric.findHostInstance_DEPRECATED(parent)),
- ).toErrorDev([
+ const match = ReactFabric.findHostInstance_DEPRECATED(parent);
+ assertConsoleErrorDev([
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
'findHostInstance_DEPRECATED was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1207,10 +1211,8 @@ describe('ReactFabric', () => {
);
});
- let match;
- expect(
- () => (match = ReactFabric.findHostInstance_DEPRECATED(parent)),
- ).toErrorDev([
+ const match = ReactFabric.findHostInstance_DEPRECATED(parent);
+ assertConsoleErrorDev([
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
'findHostInstance_DEPRECATED was passed an instance of IsInStrictMode which is inside StrictMode. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1250,8 +1252,8 @@ describe('ReactFabric', () => {
);
});
- let match;
- expect(() => (match = ReactFabric.findNodeHandle(parent))).toErrorDev([
+ const match = ReactFabric.findNodeHandle(parent);
+ assertConsoleErrorDev([
'findNodeHandle is deprecated in StrictMode. ' +
'findNodeHandle was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1291,8 +1293,8 @@ describe('ReactFabric', () => {
);
});
- let match;
- expect(() => (match = ReactFabric.findNodeHandle(parent))).toErrorDev([
+ const match = ReactFabric.findNodeHandle(parent);
+ assertConsoleErrorDev([
'findNodeHandle is deprecated in StrictMode. ' +
'findNodeHandle was passed an instance of IsInStrictMode which is inside StrictMode. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -1313,16 +1315,16 @@ describe('ReactFabric', () => {
return null;
}
}
- await expect(async () => {
- await act(() => {
- ReactFabric.render(, 11, null, true);
- });
- }).toErrorDev([
+ await act(() => {
+ ReactFabric.render(, 11, null, true);
+ });
+ assertConsoleErrorDev([
'TestComponent is accessing findNodeHandle inside its render(). ' +
'render() should be a pure function of props and state. It should ' +
'never access something that requires stale data from the previous ' +
'render, such as refs. Move this logic to componentDidMount and ' +
- 'componentDidUpdate instead.',
+ 'componentDidUpdate instead.\n' +
+ ' in TestComponent (at **)',
]);
});
diff --git a/packages/react-native-renderer/src/__tests__/ReactNativeEvents-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactNativeEvents-test.internal.js
index 46b2ad9cf1fc7..f4ab24d71d429 100644
--- a/packages/react-native-renderer/src/__tests__/ReactNativeEvents-test.internal.js
+++ b/packages/react-native-renderer/src/__tests__/ReactNativeEvents-test.internal.js
@@ -18,6 +18,7 @@ let ReactNative;
let ResponderEventPlugin;
let UIManager;
let createReactNativeComponentClass;
+let assertConsoleErrorDev;
// Parallels requireNativeComponent() in that it lazily constructs a view config,
// And registers view manager event types with ReactNativeViewConfigRegistry.
@@ -69,6 +70,7 @@ beforeEach(() => {
require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface').RCTEventEmitter;
React = require('react');
act = require('internal-test-utils').act;
+ assertConsoleErrorDev = require('internal-test-utils').assertConsoleErrorDev;
ReactNative = require('react-native-renderer');
ResponderEventPlugin =
require('react-native-renderer/src/legacy-events/ResponderEventPlugin').default;
@@ -227,30 +229,32 @@ test('handles events on text nodes', () => {
}
const log = [];
- expect(() => {
- ReactNative.render(
-
-
- log.push('string touchend')}
- onTouchEndCapture={() => log.push('string touchend capture')}
- onTouchStart={() => log.push('string touchstart')}
- onTouchStartCapture={() => log.push('string touchstart capture')}>
- Text Content
-
- log.push('number touchend')}
- onTouchEndCapture={() => log.push('number touchend capture')}
- onTouchStart={() => log.push('number touchstart')}
- onTouchStartCapture={() => log.push('number touchstart capture')}>
- {123}
-
+ ReactNative.render(
+
+
+ log.push('string touchend')}
+ onTouchEndCapture={() => log.push('string touchend capture')}
+ onTouchStart={() => log.push('string touchstart')}
+ onTouchStartCapture={() => log.push('string touchstart capture')}>
+ Text Content
- ,
- 1,
- );
- }).toErrorDev([
- 'ContextHack uses the legacy childContextTypes API which will soon be removed. Use React.createContext() instead.',
+ log.push('number touchend')}
+ onTouchEndCapture={() => log.push('number touchend capture')}
+ onTouchStart={() => log.push('number touchstart')}
+ onTouchStartCapture={() => log.push('number touchstart capture')}>
+ {123}
+
+
+ ,
+ 1,
+ );
+ assertConsoleErrorDev([
+ 'ContextHack uses the legacy childContextTypes API which will soon be removed. ' +
+ 'Use React.createContext() instead. ' +
+ '(https://react.dev/link/legacy-context)' +
+ '\n in ContextHack (at **)',
]);
expect(UIManager.createView).toHaveBeenCalledTimes(5);
diff --git a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js
index 790078b224b83..0aa1c3f0ba0af 100644
--- a/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js
+++ b/packages/react-native-renderer/src/__tests__/ReactNativeMount-test.internal.js
@@ -18,6 +18,7 @@ let UIManager;
let TextInputState;
let ReactNativePrivateInterface;
let act;
+let assertConsoleErrorDev;
const DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT =
"dispatchCommand was called with a ref that isn't a " +
@@ -32,7 +33,7 @@ describe('ReactNative', () => {
jest.resetModules();
React = require('react');
- act = require('internal-test-utils').act;
+ ({act, assertConsoleErrorDev} = require('internal-test-utils'));
StrictMode = React.StrictMode;
ReactNative = require('react-native-renderer');
ReactNativePrivateInterface = require('react-native/Libraries/ReactPrivate/ReactNativePrivateInterface');
@@ -158,9 +159,8 @@ describe('ReactNative', () => {
);
expect(UIManager.dispatchViewManagerCommand).not.toBeCalled();
- expect(() => {
- ReactNative.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
- }).toErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
+ ReactNative.dispatchCommand(viewRef, 'updateCommand', [10, 20]);
+ assertConsoleErrorDev([DISPATCH_COMMAND_REQUIRES_HOST_COMPONENT], {
withoutStack: true,
});
@@ -219,9 +219,8 @@ describe('ReactNative', () => {
);
expect(UIManager.sendAccessibilityEvent).not.toBeCalled();
- expect(() => {
- ReactNative.sendAccessibilityEvent(viewRef, 'updateCommand', [10, 20]);
- }).toErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
+ ReactNative.sendAccessibilityEvent(viewRef, 'updateCommand', [10, 20]);
+ assertConsoleErrorDev([SEND_ACCESSIBILITY_EVENT_REQUIRES_HOST_COMPONENT], {
withoutStack: true,
});
@@ -614,10 +613,8 @@ describe('ReactNative', () => {
ReactNative.render( (parent = n)} />, 11);
- let match;
- expect(
- () => (match = ReactNative.findHostInstance_DEPRECATED(parent)),
- ).toErrorDev([
+ const match = ReactNative.findHostInstance_DEPRECATED(parent);
+ assertConsoleErrorDev([
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
'findHostInstance_DEPRECATED was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -652,10 +649,8 @@ describe('ReactNative', () => {
11,
);
- let match;
- expect(
- () => (match = ReactNative.findHostInstance_DEPRECATED(parent)),
- ).toErrorDev([
+ const match = ReactNative.findHostInstance_DEPRECATED(parent);
+ assertConsoleErrorDev([
'findHostInstance_DEPRECATED is deprecated in StrictMode. ' +
'findHostInstance_DEPRECATED was passed an instance of IsInStrictMode which is inside StrictMode. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -689,8 +684,8 @@ describe('ReactNative', () => {
ReactNative.render( (parent = n)} />, 11);
- let match;
- expect(() => (match = ReactNative.findNodeHandle(parent))).toErrorDev([
+ const match = ReactNative.findNodeHandle(parent);
+ assertConsoleErrorDev([
'findNodeHandle is deprecated in StrictMode. ' +
'findNodeHandle was passed an instance of ContainsStrictModeChild which renders StrictMode children. ' +
'Instead, add a ref directly to the element you want to reference. ' +
@@ -725,8 +720,8 @@ describe('ReactNative', () => {
11,
);
- let match;
- expect(() => (match = ReactNative.findNodeHandle(parent))).toErrorDev([
+ const match = ReactNative.findNodeHandle(parent);
+ assertConsoleErrorDev([
'findNodeHandle is deprecated in StrictMode. ' +
'findNodeHandle was passed an instance of IsInStrictMode which is inside StrictMode. ' +
'Instead, add a ref directly to the element you want to reference. ' +
diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
index 3eccca1a9ba70..040bb046b5518 100644
--- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
+++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
@@ -38,6 +38,7 @@ let ReactServerDOM;
let Scheduler;
let ReactServerScheduler;
let reactServerAct;
+let assertConsoleErrorDev;
describe('ReactFlightDOMBrowser', () => {
beforeEach(() => {
@@ -75,7 +76,7 @@ describe('ReactFlightDOMBrowser', () => {
Scheduler = require('scheduler');
patchMessageChannel(Scheduler);
- act = require('internal-test-utils').act;
+ ({act, assertConsoleErrorDev} = require('internal-test-utils'));
React = require('react');
ReactDOM = require('react-dom');
ReactDOMClient = require('react-dom/client');
@@ -1156,25 +1157,38 @@ describe('ReactFlightDOMBrowser', () => {
const container = document.createElement('div');
const root = ReactDOMClient.createRoot(container);
- await expect(async () => {
- const stream = await serverAct(() =>
- ReactServerDOMServer.renderToReadableStream(
- <>
- {Array(6).fill(no key
)}
-
- {Array(6).fill(no key
)}
-
- >,
- webpackMap,
- ),
- );
- const result =
- await ReactServerDOMClient.createFromReadableStream(stream);
+ const stream = await serverAct(() =>
+ ReactServerDOMServer.renderToReadableStream(
+ <>
+ {Array(6).fill(no key
)}
+
+ {Array(6).fill(no key
)}
+
+ >,
+ webpackMap,
+ ),
+ );
+ const result = await ReactServerDOMClient.createFromReadableStream(stream);
- await act(() => {
- root.render(result);
- });
- }).toErrorDev('Each child in a list should have a unique "key" prop.');
+ if (!gate(flags => flags.enableOwnerStacks)) {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop. ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in div (at **)',
+ ]);
+ }
+
+ await act(() => {
+ root.render(result);
+ });
+ if (gate(flags => flags.enableOwnerStacks)) {
+ assertConsoleErrorDev([
+ 'Each child in a list should have a unique "key" prop.\n\n' +
+ 'Check the top-level render call using . ' +
+ 'See https://react.dev/link/warning-keys for more information.\n' +
+ ' in div (at **)',
+ ]);
+ }
});
it('basic use(promise)', async () => {
diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
index f2814f250a2df..603dbbf09e5ca 100644
--- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
+++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
@@ -37,6 +37,7 @@ let ReactServerDOMStaticServer;
let ReactServerDOMClient;
let use;
let reactServerAct;
+let assertConsoleErrorDev;
function normalizeCodeLocInfo(str) {
return (
@@ -66,6 +67,8 @@ describe('ReactFlightDOMEdge', () => {
jest.resetModules();
reactServerAct = require('internal-test-utils').serverAct;
+ assertConsoleErrorDev =
+ require('internal-test-utils').assertConsoleErrorDev;
// Simulate the condition resolution
jest.mock('react', () => require('react/react.react-server'));
@@ -802,17 +805,19 @@ describe('ReactFlightDOMEdge', () => {
),
};
- expect(() => {
- ServerModule.greet.bind({}, 'hi');
- }).toErrorDev(
- 'Cannot bind "this" of a Server Action. Pass null or undefined as the first argument to .bind().',
+ ServerModule.greet.bind({}, 'hi');
+ assertConsoleErrorDev(
+ [
+ 'Cannot bind "this" of a Server Action. Pass null or undefined as the first argument to .bind().',
+ ],
{withoutStack: true},
);
- expect(() => {
- ServerModuleImportedOnClient.greet.bind({}, 'hi');
- }).toErrorDev(
- 'Cannot bind "this" of a Server Action. Pass null or undefined as the first argument to .bind().',
+ ServerModuleImportedOnClient.greet.bind({}, 'hi');
+ assertConsoleErrorDev(
+ [
+ 'Cannot bind "this" of a Server Action. Pass null or undefined as the first argument to .bind().',
+ ],
{withoutStack: true},
);
});
diff --git a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js
index 0b4549d5bac47..bb7c2c955bcb4 100644
--- a/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js
+++ b/packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMForm-test.js
@@ -50,6 +50,7 @@ let ReactServerDOMClient;
let ReactDOMClient;
let useActionState;
let act;
+let assertConsoleErrorDev;
describe('ReactFlightDOMForm', () => {
beforeEach(() => {
@@ -72,6 +73,8 @@ describe('ReactFlightDOMForm', () => {
ReactDOMServer = require('react-dom/server.edge');
ReactDOMClient = require('react-dom/client');
act = React.act;
+ assertConsoleErrorDev =
+ require('internal-test-utils').assertConsoleErrorDev;
// TODO: Test the old api but it warns so needs warnings to be asserted.
// if (__VARIANT__) {
@@ -959,12 +962,13 @@ describe('ReactFlightDOMForm', () => {
await readIntoContainer(postbackSsrStream);
}
- await expect(submitTheForm).toErrorDev(
+ await submitTheForm();
+ assertConsoleErrorDev([
'Failed to serialize an action for progressive enhancement:\n' +
'Error: React Element cannot be passed to Server Functions from the Client without a temporary reference set. Pass a TemporaryReferenceSet to the options.\n' +
' []\n' +
' ^^^^^^',
- );
+ ]);
// The error message was returned as JSX.
const form2 = container.getElementsByTagName('form')[0];
@@ -1035,10 +1039,11 @@ describe('ReactFlightDOMForm', () => {
await readIntoContainer(postbackSsrStream);
}
- await expect(submitTheForm).toErrorDev(
+ await submitTheForm();
+ assertConsoleErrorDev([
'Failed to serialize an action for progressive enhancement:\n' +
'Error: File/Blob fields are not yet supported in progressive forms. Will fallback to client hydration.',
- );
+ ]);
expect(blob instanceof Blob).toBe(true);
expect(blob.size).toBe(2);
diff --git a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js
index e3400b173a21d..0b08cde378c45 100644
--- a/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js
+++ b/packages/react-test-renderer/src/__tests__/ReactTestRenderer-test.js
@@ -14,6 +14,7 @@ let React;
let ReactCache;
let ReactTestRenderer;
let act;
+let assertConsoleErrorDev;
describe('ReactTestRenderer', () => {
beforeEach(() => {
@@ -27,19 +28,27 @@ describe('ReactTestRenderer', () => {
ReactTestRenderer = require('react-test-renderer');
const InternalTestUtils = require('internal-test-utils');
act = InternalTestUtils.act;
+ assertConsoleErrorDev = InternalTestUtils.assertConsoleErrorDev;
});
it('should warn if used to render a ReactDOM portal', async () => {
const container = document.createElement('div');
let error;
- await expect(async () => {
- await act(() => {
- ReactTestRenderer.create(ReactDOM.createPortal('foo', container));
- }).catch(e => (error = e));
- }).toErrorDev('An invalid container has been provided.', {
- withoutStack: true,
- });
+ await act(() => {
+ ReactTestRenderer.create(ReactDOM.createPortal('foo', container));
+ }).catch(e => (error = e));
+ assertConsoleErrorDev(
+ [
+ 'An invalid container has been provided. ' +
+ 'This may indicate that another renderer is being used in addition to the test renderer. ' +
+ '(For example, ReactDOM.createPortal inside of a ReactTestRenderer tree.) ' +
+ 'This is not supported.',
+ ],
+ {
+ withoutStack: true,
+ },
+ );
// After the update throws, a subsequent render is scheduled to
// unmount the whole tree. This update also causes an error, so React
diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
index 8d38112b16879..81060cfafb1b1 100644
--- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
+++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
@@ -68,7 +68,7 @@ export const enableFabricCompleteRootInCommitPhase = false;
export const enableSiblingPrerendering = true;
export const enableUseResourceEffectHook = true;
export const enableHydrationLaneScheduling = true;
-export const enableYieldingBeforePassive = true;
+export const enableYieldingBeforePassive = false;
// Flow magic to verify the exports of this file match the original version.
((((null: any): ExportsType): FeatureFlagsType): ExportsType);
diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
index 28a303a034cac..e0e9906d52b8f 100644
--- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
+++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
@@ -82,7 +82,7 @@ export const enableUseResourceEffectHook = false;
export const enableHydrationLaneScheduling = true;
-export const enableYieldingBeforePassive = true;
+export const enableYieldingBeforePassive = false;
// Flow magic to verify the exports of this file match the original version.
((((null: any): ExportsType): FeatureFlagsType): ExportsType);