react19-test-patterns — GitHub Copilot skill for React 19 tests
A migration reference for updating test files to work with React 19. Use it when replacing removed test utilities or revising StrictMode call-count assertions.
npx skills add github/awesome-copilot --skill react19-test-patternsWhat react19-test-patterns does
The skill lays out a migration order: import act from react, replace Simulate with fireEvent, then remove remaining react-dom/test-utils imports. It maps older helpers such as renderIntoDocument and findRenderedDOMComponentWithTag to React Testing Library alternatives.
It also covers StrictMode assertions. In React 19, effects no longer run twice in development, while render-phase calls can still be doubled. The guide recommends reading the actual count from the failing test rather than guessing. It also includes async act wrapping for remaining warnings.
Use this skill when bringing a test suite up to React 19. Its replacement examples use @testing-library/react; install it with npx skills add github/awesome-copilot --skill react19-test-patterns or place the skill file at .github/skills/react19-test-patterns/SKILL.md.
What it helps with
- move
actimports fromreact-dom/test-utilstoreact - replace
Simulateinteractions withfireEvent - map removed test utilities to React Testing Library queries
- revise effect call-count assertions for React 19
StrictMode - wrap remaining asynchronous updates with
act
Example prompts for the agent
- Update `LoginForm.test.jsx` for React 19 using react19-test-patterns.
- Replace `Simulate` in `Button.test.jsx` with `fireEvent` and fix the imports.
- Check the `StrictMode` call-count assertions in `Profile.test.jsx` against the test output.
How to install react19-test-patterns
1Skills CLI (Vercel)
npx skills add github/awesome-copilot --skill react19-test-patterns2GitHub CLI
gh skill install github/awesome-copilot react19-test-patterns3Manually: put the files in place
.github/skills/react19-test-patterns/SKILL.md1Skills CLI (Vercel)
npx skills add github/awesome-copilot --skill react19-test-patterns -a claude-code2Manually: put the files in place
~/.claude/skills/react19-test-patterns/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/react19-test-patterns/
Manually: put the files in place
.agents/skills/react19-test-patterns/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/react19-test-patterns/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
Platform CLI
gemini skills install https://github.com/github/awesome-copilot --path skills/react19-test-patternsManually: put the files in place
.devin/skills/react19-test-patterns/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set554
The whole set →Similar
Questions about react19-test-patterns
How do I install react19-test-patterns for GitHub Copilot?
Run npx skills add github/awesome-copilot --skill react19-test-patterns or use gh skill install github/awesome-copilot react19-test-patterns.
What does react19-test-patterns do?
It provides migration guidance for React 19 tests, including act imports, removed test utilities, and StrictMode call-count assertions.
Does it use React Testing Library?
Yes. The examples use fireEvent and render from @testing-library/react as replacements for older test utilities.
Source text
SKILL.md · MIT
---
name: react19-test-patterns
description: 'Provides before/after patterns for migrating test files to React 19 compatibility, including act() imports, Simulate removal, and StrictMode call count changes.'
---
# React 19 Test Migration Patterns
Reference for all test file migrations required by React 19.
## Priority Order
Fix test files in this order; each layer depends on the previous:
1. **`act` import** fix first, it unblocks everything else
2. **`Simulate` → `fireEvent`** fix immediately after act
3. **Full react-dom/test-utils cleanup** remove remaining imports
4. **StrictMode call counts** measure actual, don't guess
5. **Async act wrapping** for remaining "not wrapped in act" warnings
6. **Custom render helper** verify once per codebase, not per test
---
## 1. act() Import Fix
```jsx
// Before REMOVED in React 19:
import { act } from 'react-dom/test-utils';
// After:
import { act } from 'react';
```
If mixed with other test-utils imports:
```jsx
// Before:
import { act, Simulate, renderIntoDocument } from 'react-dom/test-utils';
// After split the imports:
import { act } from 'react';
import { fireEvent, render } from '@testing-library/react'; // replaces Simulate + renderIntoDocument
```
---
## 2. Simulate → fireEvent
```jsx
// Before Simulate REMOVED in React 19:
import { Simulate } from 'react-dom/test-utils';
Simulate.click(element);
Simulate.change(input, { target: { value: 'hello' } });
Simulate.submit(form);
Simulate.keyDown(element, { key: 'Enter', keyCode: 13 });
// After:
import { fireEvent } from '@testing-library/react';
fireEvent.click(element);
fireEvent.change(input, { target: { value: 'hello' } });
fireEvent.submit(form);
fireEvent.keyDown(element, { key: 'Enter', keyCode: 13 });
```
---
## 3. react-dom/test-utils Full API Map
| Old (react-dom/test-utils) | New location |
|---|---|
| `act` | `import { act } from 'react'` |
| `Simulate` | `fireEvent` from `@testing-library/react` |
| `renderIntoDocument` | `render` from `@testing-library/react` |
| `findRenderedDOMComponentWithTag` | `getByRole`, `getByTestId` from RTL |
| `findRenderedDOMComponentWithClass` | `getByRole` or `container.querySelector` |
| `scryRenderedDOMComponentsWithTag` | `getAllByRole` from RTL |
| `isElement`, `isCompositeComponent` | Remove not needed with RTL |
| `isDOMComponent` | Remove |
---
## 4. StrictMode Call Count Fixes
React 19 StrictMode no longer double-invokes `useEffect` in development. Spy assertions counting effect calls must be updated.
**Strategy always measure, never guess:**
```bash
# Run the failing test, read the actual count from the error:
npm test -- --watchAll=false --testPathPattern="[filename]" --forceExit 2>&1 | grep -E "Expected|Received"
```
```jsx
// Before (React 18 StrictMode effects ran twice):
expect(mockFn).toHaveBeenCalledTimes(2); // 1 call × 2 (strict double-invoke)
// After (React 19 StrictMode effects run once):
expect(mockFn).toHaveBeenCalledTimes(1);
```
```jsx
// Render-phase calls (component body) still double-invoked in React 19 StrictMode:
expect(renderSpy).toHaveBeenCalledTimes(2); // stays at 2 for render body calls
```
© github · MIT · github/awesome-copilot