Skip to content

Commit ef8ac8c

Browse files
committed
Wrap DevTools test updates with act
These tests expect the `scheduleUpdate` DevTools hook to trigger a synchronous re-render with legacy semantics, but flushing in a microtask is fine. Wrapping the updates with `act` fixes it.
1 parent 0120986 commit ef8ac8c

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

packages/react-debug-tools/src/__tests__/ReactDevToolsHooksIntegration-test.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -201,32 +201,32 @@ describe('React hooks DevTools integration', () => {
201201
if (__DEV__) {
202202
// First render was locked
203203
expect(renderer.toJSON().children).toEqual(['Loading']);
204-
scheduleUpdate(fiber); // Re-render
204+
act(() => scheduleUpdate(fiber)); // Re-render
205205
expect(renderer.toJSON().children).toEqual(['Loading']);
206206

207207
// Release the lock
208208
setSuspenseHandler(() => false);
209-
scheduleUpdate(fiber); // Re-render
209+
act(() => scheduleUpdate(fiber)); // Re-render
210210
expect(renderer.toJSON().children).toEqual(['Done']);
211-
scheduleUpdate(fiber); // Re-render
211+
act(() => scheduleUpdate(fiber)); // Re-render
212212
expect(renderer.toJSON().children).toEqual(['Done']);
213213

214214
// Lock again
215215
setSuspenseHandler(() => true);
216-
scheduleUpdate(fiber); // Re-render
216+
act(() => scheduleUpdate(fiber)); // Re-render
217217
expect(renderer.toJSON().children).toEqual(['Loading']);
218218

219219
// Release the lock again
220220
setSuspenseHandler(() => false);
221-
scheduleUpdate(fiber); // Re-render
221+
act(() => scheduleUpdate(fiber)); // Re-render
222222
expect(renderer.toJSON().children).toEqual(['Done']);
223223

224224
// Ensure it checks specific fibers.
225225
setSuspenseHandler(f => f === fiber || f === fiber.alternate);
226-
scheduleUpdate(fiber); // Re-render
226+
act(() => scheduleUpdate(fiber)); // Re-render
227227
expect(renderer.toJSON().children).toEqual(['Loading']);
228228
setSuspenseHandler(f => f !== fiber && f !== fiber.alternate);
229-
scheduleUpdate(fiber); // Re-render
229+
act(() => scheduleUpdate(fiber)); // Re-render
230230
expect(renderer.toJSON().children).toEqual(['Done']);
231231
} else {
232232
expect(renderer.toJSON().children).toEqual(['Done']);
@@ -259,33 +259,33 @@ describe('React hooks DevTools integration', () => {
259259
if (__DEV__) {
260260
// First render was locked
261261
expect(renderer.toJSON().children).toEqual(['Loading']);
262-
scheduleUpdate(fiber); // Re-render
262+
act(() => scheduleUpdate(fiber)); // Re-render
263263
expect(renderer.toJSON().children).toEqual(['Loading']);
264264

265265
// Release the lock
266266
setSuspenseHandler(() => false);
267-
scheduleUpdate(fiber); // Re-render
267+
act(() => scheduleUpdate(fiber)); // Re-render
268268
Scheduler.unstable_flushAll();
269269
expect(renderer.toJSON().children).toEqual(['Done']);
270-
scheduleUpdate(fiber); // Re-render
270+
act(() => scheduleUpdate(fiber)); // Re-render
271271
expect(renderer.toJSON().children).toEqual(['Done']);
272272

273273
// Lock again
274274
setSuspenseHandler(() => true);
275-
scheduleUpdate(fiber); // Re-render
275+
act(() => scheduleUpdate(fiber)); // Re-render
276276
expect(renderer.toJSON().children).toEqual(['Loading']);
277277

278278
// Release the lock again
279279
setSuspenseHandler(() => false);
280-
scheduleUpdate(fiber); // Re-render
280+
act(() => scheduleUpdate(fiber)); // Re-render
281281
expect(renderer.toJSON().children).toEqual(['Done']);
282282

283283
// Ensure it checks specific fibers.
284284
setSuspenseHandler(f => f === fiber || f === fiber.alternate);
285-
scheduleUpdate(fiber); // Re-render
285+
act(() => scheduleUpdate(fiber)); // Re-render
286286
expect(renderer.toJSON().children).toEqual(['Loading']);
287287
setSuspenseHandler(f => f !== fiber && f !== fiber.alternate);
288-
scheduleUpdate(fiber); // Re-render
288+
act(() => scheduleUpdate(fiber)); // Re-render
289289
expect(renderer.toJSON().children).toEqual(['Done']);
290290
} else {
291291
expect(renderer.toJSON().children).toEqual(['Done']);

packages/react-dom/src/__tests__/ReactDOMNativeEventHeuristic-test.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,15 @@ describe('ReactDOMNativeEventHeuristic-test', () => {
317317
pressEvent.initEvent('click', true, true);
318318
dispatchAndSetCurrentEvent(target.current, pressEvent);
319319

320-
expect(Scheduler).toHaveYielded([]);
321320
expect(container.textContent).toEqual('Count: 2');
322-
expect(Scheduler).toFlushAndYield([2]);
321+
if (gate(flags => flags.enableDiscreteEventFlushingChange)) {
322+
// When enableDiscreteEventFlushingChange is enabled, we don't flush
323+
// discrete callbacks synchronously at the end of the event.
324+
// TODO: I believe this flag is no longer relevant, because we flush the
325+
// updates in a microtask, anyway.
326+
expect(Scheduler).toFlushAndYield([2]);
327+
} else {
328+
expect(Scheduler).toHaveYielded([2]);
329+
}
323330
});
324331
});

0 commit comments

Comments
 (0)