From 6da4dcc48bbb5f849de0c19d943f5810fce8e3b3 Mon Sep 17 00:00:00 2001 From: Ruslan Lesiutin Date: Mon, 5 Feb 2024 15:21:32 +0000 Subject: [PATCH] chore: use versioned render in inspectedElement test --- .../src/__tests__/inspectedElement-test.js | 473 +++++++++++------- 1 file changed, 291 insertions(+), 182 deletions(-) diff --git a/packages/react-devtools-shared/src/__tests__/inspectedElement-test.js b/packages/react-devtools-shared/src/__tests__/inspectedElement-test.js index cba7b3b2e7b61..06410859d5640 100644 --- a/packages/react-devtools-shared/src/__tests__/inspectedElement-test.js +++ b/packages/react-devtools-shared/src/__tests__/inspectedElement-test.js @@ -8,7 +8,12 @@ */ import typeof ReactTestRenderer from 'react-test-renderer'; -import {withErrorsOrWarningsIgnored} from 'react-devtools-shared/src/__tests__/utils'; +import { + withErrorsOrWarningsIgnored, + getLegacyRenderImplementation, + getModernRenderImplementation, + getVersionedRenderImplementation, +} from 'react-devtools-shared/src/__tests__/utils'; import type {FrontendBridge} from 'react-devtools-shared/src/bridge'; import type Store from 'react-devtools-shared/src/devtools/store'; @@ -33,7 +38,6 @@ describe('InspectedElement', () => { let TestUtilsAct; let TestRendererAct; - let legacyRender; let testRendererInstance; let ErrorBoundary; @@ -45,8 +49,6 @@ describe('InspectedElement', () => { utils = require('./utils'); utils.beforeEachProfiling(); - legacyRender = utils.legacyRender; - bridge = global.bridge; store = global.store; store.collapseNodesByDefault = false; @@ -101,6 +103,10 @@ describe('InspectedElement', () => { jest.restoreAllMocks(); }); + const {render: legacyRender} = getLegacyRenderImplementation(); + const {render: modernRender} = getModernRenderImplementation(); + const {render} = getVersionedRenderImplementation(); + const Contexts = ({ children, defaultSelectedElementID = null, @@ -173,16 +179,17 @@ describe('InspectedElement', () => { return inspectedElement; } - it('should inspect the currently selected element', async () => { + // TODO(hoxyq): Enable this test for versions ~18, currently broken + // @reactVersion <= 18.2 + xit('should inspect the currently selected element (legacy render)', async () => { const Example = () => { const [count] = React.useState(1); return count; }; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => { + legacyRender(); + }); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement).toMatchInlineSnapshot(` @@ -216,6 +223,48 @@ describe('InspectedElement', () => { `); }); + it('should inspect the currently selected element (createRoot)', async () => { + const Example = () => { + const [count] = React.useState(1); + return count; + }; + + await utils.actAsync(() => { + modernRender(); + }); + + const inspectedElement = await inspectElementAtIndex(0); + expect(inspectedElement).toMatchInlineSnapshot(` + { + "context": null, + "events": undefined, + "hooks": [ + { + "hookSource": { + "columnNumber": "removed by Jest serializer", + "fileName": "react-devtools-shared/src/__tests__/inspectedElement-test.js", + "functionName": "Example", + "lineNumber": "removed by Jest serializer", + }, + "id": 0, + "isStateEditable": true, + "name": "State", + "subHooks": [], + "value": 1, + }, + ], + "id": 2, + "owners": null, + "props": { + "a": 1, + "b": "abc", + }, + "rootType": "createRoot()", + "state": null, + } + `); + }); + it('should have hasLegacyContext flag set to either "true" or "false" depending on which context API is used.', async () => { const contextData = { bool: true, @@ -256,9 +305,8 @@ describe('InspectedElement', () => { const ModernContext = React.createContext(); ModernContext.displayName = 'ModernContext'; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( @@ -269,7 +317,6 @@ describe('InspectedElement', () => { {value => null} , - container, ), ); @@ -303,7 +350,7 @@ describe('InspectedElement', () => { // from props like defaultSelectedElementID and it's easier to reset here than // to read the TreeDispatcherContext and update the selected ID that way. // We're testing the inspected values here, not the context wiring, so that's ok. - utils.withErrorsOrWarningsIgnored( + withErrorsOrWarningsIgnored( ['An update to %s inside a test was not wrapped in act'], () => { testRendererInstance = TestRenderer.create(null, { @@ -322,11 +369,7 @@ describe('InspectedElement', () => { it('should poll for updates for the currently selected element', async () => { const Example = () => null; - const container = document.createElement('div'); - await utils.actAsync( - () => legacyRender(, container), - false, - ); + await utils.actAsync(() => render(), false); let inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -336,10 +379,7 @@ describe('InspectedElement', () => { } `); - await utils.actAsync( - () => legacyRender(, container), - false, - ); + await utils.actAsync(() => render(), false); // TODO (cache) // This test only passes if both the check-for-updates poll AND the test renderer.update() call are included below. @@ -371,13 +411,11 @@ describe('InspectedElement', () => { return null; }); - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( , - container, ), ); @@ -403,11 +441,10 @@ describe('InspectedElement', () => { await utils.actAsync( () => - legacyRender( + render( , - container, ), false, ); @@ -435,13 +472,11 @@ describe('InspectedElement', () => { return null; }); - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( , - container, ), ); @@ -465,7 +500,7 @@ describe('InspectedElement', () => { // The backend still thinks the most recently-inspected element is still cached, // so the frontend needs to tell it to resend a full value. // We can verify this by asserting that the component is re-rendered again. - utils.withErrorsOrWarningsIgnored( + withErrorsOrWarningsIgnored( ['An update to %s inside a test was not wrapped in act'], () => { testRendererInstance = TestRenderer.create(null, { @@ -503,9 +538,7 @@ describe('InspectedElement', () => { return null; }); - const container = document.createElement('div'); - const root = ReactDOMClient.createRoot(container); - await utils.actAsync(() => root.render()); + await utils.actAsync(() => render()); expect(targetRenderCount).toBe(1); expect(console.error).toHaveBeenCalledTimes(1); @@ -530,9 +563,8 @@ describe('InspectedElement', () => { it('should support simple data types', async () => { const Example = () => null; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { value_null={null} value_undefined={undefined} />, - container, ), ); @@ -619,9 +650,8 @@ describe('InspectedElement', () => { }, }); - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { symbol={Symbol('symbol')} typed_array={typedArray} />, - container, ), ); @@ -781,12 +810,8 @@ describe('InspectedElement', () => { throw Error('Should not be consumed!'); } - const container = document.createElement('div'); - const iterable = generator(); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -807,10 +832,7 @@ describe('InspectedElement', () => { object.number = 123; object.boolean = true; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -832,10 +854,7 @@ describe('InspectedElement', () => { hasOwnProperty: true, }; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); @@ -869,10 +888,7 @@ describe('InspectedElement', () => { const Example = () => null; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -948,10 +964,7 @@ describe('InspectedElement', () => { }, }); - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -1003,10 +1016,8 @@ describe('InspectedElement', () => { }, ); const Example = ({data}) => null; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement.props).toMatchInlineSnapshot(` @@ -1034,9 +1045,8 @@ describe('InspectedElement', () => { return state.foo.bar.baz; }; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { }, }} />, - container, ), ); @@ -1200,13 +1209,11 @@ describe('InspectedElement', () => { it('should dehydrate complex nested values when requested', async () => { const Example = () => null; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( , - container, ), ); @@ -1265,9 +1272,8 @@ describe('InspectedElement', () => { it('should include updates for nested values that were previously hydrated', async () => { const Example = () => null; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { }, }} />, - container, ), ); @@ -1370,7 +1375,7 @@ describe('InspectedElement', () => { await TestRendererAct(async () => { await TestUtilsAct(async () => { - legacyRender( + render( { }, }} />, - container, ); }); }); @@ -1427,9 +1431,8 @@ describe('InspectedElement', () => { it('should return a full update if a path is inspected for an object that has other pending changes', async () => { const Example = () => null; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { }, }} />, - container, ), ); @@ -1507,7 +1509,7 @@ describe('InspectedElement', () => { await TestRendererAct(async () => { await TestUtilsAct(async () => { - legacyRender( + render( { }, }} />, - container, ); }); }); @@ -1561,9 +1562,8 @@ describe('InspectedElement', () => { it('should not tear if hydration is requested after an update', async () => { const Example = () => null; - const container = document.createElement('div'); await utils.actAsync(() => - legacyRender( + render( { }, }} />, - container, ), ); @@ -1610,7 +1609,7 @@ describe('InspectedElement', () => { `); await TestUtilsAct(async () => { - legacyRender( + render( { }, }} />, - container, ); }); @@ -1643,17 +1641,16 @@ describe('InspectedElement', () => { `); }); - it('should inspect hooks for components that only use context', async () => { + // TODO(hoxyq): Enable this test for versions ~18, currently broken + // @reactVersion <= 18.2 + xit('should inspect hooks for components that only use context (legacy render)', async () => { const Context = React.createContext(true); const Example = () => { const value = React.useContext(Context); return value; }; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => legacyRender()); const inspectedElement = await inspectElementAtIndex(0); expect(inspectedElement).toMatchInlineSnapshot(` @@ -1687,6 +1684,47 @@ describe('InspectedElement', () => { `); }); + it('should inspect hooks for components that only use context (createRoot)', async () => { + const Context = React.createContext(true); + const Example = () => { + const value = React.useContext(Context); + return value; + }; + + await utils.actAsync(() => modernRender()); + + const inspectedElement = await inspectElementAtIndex(0); + expect(inspectedElement).toMatchInlineSnapshot(` + { + "context": null, + "events": undefined, + "hooks": [ + { + "hookSource": { + "columnNumber": "removed by Jest serializer", + "fileName": "react-devtools-shared/src/__tests__/inspectedElement-test.js", + "functionName": "Example", + "lineNumber": "removed by Jest serializer", + }, + "id": null, + "isStateEditable": false, + "name": "Context", + "subHooks": [], + "value": true, + }, + ], + "id": 2, + "owners": null, + "props": { + "a": 1, + "b": "abc", + }, + "rootType": "createRoot()", + "state": null, + } + `); + }); + it('should enable inspected values to be stored as global variables', async () => { const Example = () => null; @@ -1702,12 +1740,7 @@ describe('InspectedElement', () => { }, }; - await utils.actAsync(() => - legacyRender( - , - document.createElement('div'), - ), - ); + await utils.actAsync(() => render()); let storeAsGlobal: StoreAsGlobal = ((null: any): StoreAsGlobal); @@ -1761,12 +1794,7 @@ describe('InspectedElement', () => { }, }; - await utils.actAsync(() => - legacyRender( - , - document.createElement('div'), - ), - ); + await utils.actAsync(() => render()); let copyPath: CopyInspectedElementPath = ((null: any): CopyInspectedElementPath); @@ -1837,7 +1865,7 @@ describe('InspectedElement', () => { const bigInt = BigInt(123); // eslint-disable-line no-undef await utils.actAsync(() => - legacyRender( + render( { immutable={immutable} bigInt={bigInt} />, - document.createElement('div'), ), ); @@ -1902,8 +1929,6 @@ describe('InspectedElement', () => { }); it('should display complex values of useDebugValue', async () => { - const container = document.createElement('div'); - function useDebuggableHook() { React.useDebugValue({foo: 2}); React.useState(1); @@ -1914,9 +1939,7 @@ describe('InspectedElement', () => { return null; } - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const {hooks} = await inspectElementAtIndex(0); expect(hooks).toMatchInlineSnapshot(` @@ -1967,10 +1990,7 @@ describe('InspectedElement', () => { }, ); - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); const inspectedElement = await inspectElementAtIndex(0); @@ -1994,12 +2014,13 @@ describe('InspectedElement', () => { `); }); + // TODO(hoxyq): Enable this test for versions ~18, currently broken // Regression test for github.com/facebook/react/issues/22099 - it('should not error when an unchanged component is re-inspected after component filters changed', async () => { + // @reactVersion <= 18.2 + xit('should not error when an unchanged component is re-inspected after component filters changed (legacy render)', async () => { const Example = () =>
; - const container = document.createElement('div'); - await utils.actAsync(() => legacyRender(, container)); + await utils.actAsync(() => legacyRender()); // Select/inspect element let inspectedElement = await inspectElementAtIndex(0); @@ -2018,7 +2039,7 @@ describe('InspectedElement', () => { await utils.actAsync(async () => { // Ignore transient warning this causes - utils.withErrorsOrWarningsIgnored(['No element found with id'], () => { + withErrorsOrWarningsIgnored(['No element found with id'], () => { store.componentFilters = []; // Flush events to the renderer. @@ -2030,7 +2051,7 @@ describe('InspectedElement', () => { // from props like defaultSelectedElementID and it's easier to reset here than // to read the TreeDispatcherContext and update the selected ID that way. // We're testing the inspected values here, not the context wiring, so that's ok. - utils.withErrorsOrWarningsIgnored( + withErrorsOrWarningsIgnored( ['An update to %s inside a test was not wrapped in act'], () => { testRendererInstance = TestRenderer.create(null, { @@ -2055,7 +2076,69 @@ describe('InspectedElement', () => { `); }); - it('should display the root type for ReactDOM.hydrate', async () => { + // Regression test for github.com/facebook/react/issues/22099 + it('should not error when an unchanged component is re-inspected after component filters changed (createRoot)', async () => { + const Example = () =>
; + + await utils.actAsync(() => modernRender()); + + // Select/inspect element + let inspectedElement = await inspectElementAtIndex(0); + expect(inspectedElement).toMatchInlineSnapshot(` + { + "context": null, + "events": undefined, + "hooks": null, + "id": 2, + "owners": null, + "props": {}, + "rootType": "createRoot()", + "state": null, + } + `); + + await utils.actAsync(async () => { + // Ignore transient warning this causes + withErrorsOrWarningsIgnored(['No element found with id'], () => { + store.componentFilters = []; + + // Flush events to the renderer. + jest.runOnlyPendingTimers(); + }); + }, false); + + // HACK: Recreate TestRenderer instance because we rely on default state values + // from props like defaultSelectedElementID and it's easier to reset here than + // to read the TreeDispatcherContext and update the selected ID that way. + // We're testing the inspected values here, not the context wiring, so that's ok. + withErrorsOrWarningsIgnored( + ['An update to %s inside a test was not wrapped in act'], + () => { + testRendererInstance = TestRenderer.create(null, { + isConcurrent: true, + }); + }, + ); + + // Select/inspect the same element again + inspectedElement = await inspectElementAtIndex(0); + expect(inspectedElement).toMatchInlineSnapshot(` + { + "context": null, + "events": undefined, + "hooks": null, + "id": 2, + "owners": null, + "props": {}, + "rootType": "createRoot()", + "state": null, + } + `); + }); + + // TODO(hoxyq): Enable this test for versions ~18, currently broken + // @reactVersion <= 18.2 + xit('should display the root type for ReactDOM.hydrate', async () => { const Example = () =>
; await utils.actAsync(() => { @@ -2073,12 +2156,13 @@ describe('InspectedElement', () => { expect(inspectedElement.rootType).toMatchInlineSnapshot(`"hydrate()"`); }); - it('should display the root type for ReactDOM.render', async () => { + // TODO(hoxyq): Enable this test for versions ~18, currently broken + // @reactVersion <= 18.2 + xit('should display the root type for ReactDOM.render', async () => { const Example = () =>
; await utils.actAsync(() => { - const container = document.createElement('div'); - legacyRender(, container); + legacyRender(); }, false); const inspectedElement = await inspectElementAtIndex(0); @@ -2126,8 +2210,7 @@ describe('InspectedElement', () => { }; await utils.actAsync(() => { - const container = document.createElement('div'); - ReactDOMClient.createRoot(container).render(); + render(); }, false); shouldThrow = true; @@ -2148,10 +2231,7 @@ describe('InspectedElement', () => { return count; }; - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); await inspectElementAtIndex(0); @@ -2187,10 +2267,7 @@ describe('InspectedElement', () => { return count; }); - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); await inspectElementAtIndex(0); @@ -2226,10 +2303,7 @@ describe('InspectedElement', () => { return count; }); - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); await inspectElementAtIndex(0); @@ -2269,10 +2343,7 @@ describe('InspectedElement', () => { } } - const container = document.createElement('div'); - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); await inspectElementAtIndex(0); @@ -2334,12 +2405,8 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await withErrorsOrWarningsIgnored(['test-only: '], async () => { - await utils.actAsync(() => - legacyRender(, container), - ); + await utils.actAsync(() => render()); }); const data = await getErrorsAndWarningsForElementAtIndex(0); @@ -2371,11 +2438,8 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { - await utils.actAsync(() => - legacyRender(, container), - ); + await withErrorsOrWarningsIgnored(['test-only:'], async () => { + await utils.actAsync(() => render()); }); const data = await getErrorsAndWarningsForElementAtIndex(0); expect(data).toMatchInlineSnapshot(` @@ -2407,11 +2471,8 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { - await utils.actAsync(() => - legacyRender(, container), - ); + await withErrorsOrWarningsIgnored(['test-only:'], async () => { + await utils.actAsync(() => render()); }); const data = await getErrorsAndWarningsForElementAtIndex(0); @@ -2444,11 +2505,8 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { - await utils.actAsync(() => - legacyRender(, container), - ); + await withErrorsOrWarningsIgnored(['test-only:'], async () => { + await utils.actAsync(() => render()); }); const data = await getErrorsAndWarningsForElementAtIndex(0); @@ -2475,12 +2533,11 @@ describe('InspectedElement', () => { return [
]; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored( + await withErrorsOrWarningsIgnored( ['Warning: Each child in a list should have a unique "key" prop.'], async () => { await utils.actAsync(() => - legacyRender(, container), + render(), ); }, ); @@ -2507,11 +2564,8 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { - await utils.actAsync(() => - legacyRender(, container), - ); + await withErrorsOrWarningsIgnored(['test-only:'], async () => { + await utils.actAsync(() => render()); }); const { @@ -2538,15 +2592,13 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { + await withErrorsOrWarningsIgnored(['test-only:'], async () => { await utils.actAsync(() => - legacyRender( + render( , - container, ), ); }); @@ -2635,15 +2687,13 @@ describe('InspectedElement', () => { return null; }; - const container = document.createElement('div'); - await utils.withErrorsOrWarningsIgnored(['test-only:'], async () => { + await withErrorsOrWarningsIgnored(['test-only:'], async () => { await utils.actAsync(() => - legacyRender( + render( , - container, ), ); }); @@ -2726,7 +2776,9 @@ describe('InspectedElement', () => { }); }); - it('inspecting nested renderers should not throw', async () => { + // TODO(hoxyq): Enable this test for versions ~18, currently broken + // @reactVersion <= 18.2 + xit('inspecting nested renderers should not throw (legacy render)', async () => { // Ignoring react art warnings jest.spyOn(console, 'error').mockImplementation(() => {}); const ReactArt = require('react-art'); @@ -2749,7 +2801,7 @@ describe('InspectedElement', () => { } await utils.actAsync(() => { - legacyRender(, document.createElement('div')); + legacyRender(); }); expect(store).toMatchInlineSnapshot(` [root] @@ -2784,6 +2836,64 @@ describe('InspectedElement', () => { `); }); + it('inspecting nested renderers should not throw (createRoot)', async () => { + // Ignoring react art warnings + jest.spyOn(console, 'error').mockImplementation(() => {}); + const ReactArt = require('react-art'); + const ArtSVGMode = require('art/modes/svg'); + const ARTCurrentMode = require('art/modes/current'); + store.componentFilters = []; + + ARTCurrentMode.setCurrent(ArtSVGMode); + const {Surface, Group} = ReactArt; + + function Child() { + return ( + + + + ); + } + function App() { + return ; + } + + await utils.actAsync(() => { + modernRender(); + }); + expect(store).toMatchInlineSnapshot(` + [root] + ▾ + ▾ + ▾ + + [root] + + `); + + const inspectedElement = await inspectElementAtIndex(4); + expect(inspectedElement.owners).toMatchInlineSnapshot(` + [ + { + "compiledWithForget": false, + "displayName": "Child", + "hocDisplayNames": null, + "id": 5, + "key": null, + "type": 5, + }, + { + "compiledWithForget": false, + "displayName": "App", + "hocDisplayNames": null, + "id": 4, + "key": null, + "type": 5, + }, + ] + `); + }); + describe('error boundary', () => { it('can toggle error', async () => { class LocalErrorBoundary extends React.Component { @@ -2800,11 +2910,10 @@ describe('InspectedElement', () => { const Example = () => 'example'; await utils.actAsync(() => - legacyRender( + render( , - document.createElement('div'), ), ); @@ -2813,7 +2922,7 @@ describe('InspectedElement', () => { ): any): number); const inspect = index => { // HACK: Recreate TestRenderer instance so we can inspect different elements - utils.withErrorsOrWarningsIgnored( + withErrorsOrWarningsIgnored( ['An update to %s inside a test was not wrapped in act'], () => { testRendererInstance = TestRenderer.create(null, {