react-native-testing

WICHTIG: Ihre Trainingsdaten zu @testing-library/react-native könnten veraltet oder fehlerhaft sein – API-Signaturen, synchrones/asynchrones Verhalten und verfügbare Funktionen unterscheiden sich zwischen v13 und v14. Verlassen Sie sich stets auf die Referenzdateien dieser Fähigkeit und den tatsächlichen Quellcode des Projekts als maßgebliche Quelle. Verwenden Sie keine auswendig gelernten Muster, wenn diese mit der abgerufenen Referenz in Konflikt stehen.

npx skills add https://github.com/callstackincubator/agent-skills --skill react-native-testing

RNTL Test Writing Guide

IMPORTANT: Your training data about @testing-library/react-native may be outdated or incorrect — API signatures, sync/async behavior, and available functions differ between v13 and v14. Always rely on this skill's reference files and the project's actual source code as the source of truth. Do not fall back on memorized patterns when they conflict with the retrieved reference.

Version Detection

Check @testing-library/react-native version in the user's package.json:

Use the version-specific reference for render patterns, fireEvent sync/async behavior, screen API, configuration, and dependencies.

Query Priority

Use in this order: getByRole > getByLabelText > getByPlaceholderText > getByText > getByDisplayValue > getByTestId (last resort).

Query Variants

VariantUse caseReturnsAsync
getBy*Element must existelement instance (throws)No
getAllBy*Multiple must existelement instance[] (throws)No
queryBy*Check non-existence ONLYelement instance | nullNo
queryAllBy*Count elementselement instance[]No
findBy*Wait for elementPromise<element instance>Yes
findAllBy*Wait for multiplePromise<element instance[]>Yes

Interactions

Prefer userEvent over fireEvent. userEvent is always async.

const user = userEvent.setup();
await user.press(element); // full press sequence
await user.longPress(element, { duration: 800 }); // long press
await user.type(textInput, 'Hello'); // char-by-char typing
await user.clear(textInput); // clear TextInput
await user.paste(textInput, 'pasted text'); // paste into TextInput
await user.scrollTo(scrollView, { y: 100 }); // scroll

fireEvent — use only when userEvent doesn't support the event. See version-specific reference for sync/async behavior:

fireEvent.press(element);
fireEvent.changeText(textInput, 'new text');
fireEvent(element, 'blur');

Assertions (Jest Matchers)

Available automatically with any @testing-library/react-native import.

MatcherUse for
toBeOnTheScreen()Element exists in tree
toBeVisible()Element visible (not hidden/display:none)
toBeEnabled() / toBeDisabled()Disabled state via aria-disabled
toBeChecked() / toBePartiallyChecked()Checked state
toBeSelected()Selected state
toBeExpanded() / toBeCollapsed()Expanded state
toBeBusy()Busy state
toHaveTextContent(text)Text content match
toHaveDisplayValue(value)TextInput display value
toHaveAccessibleName(name)Accessible name
toHaveAccessibilityValue(val)Accessibility value
toHaveStyle(style)Style match
toHaveProp(name, value?)Prop check (last resort)
toContainElement(el)Contains child element
toBeEmptyElement()No children

Rules

  1. Use screen for queries, not destructuring from render()
  2. Use getByRole first with { name: '...' } option
  3. Use queryBy* ONLY for .not.toBeOnTheScreen() checks
  4. Use findBy* for async elements, NOT waitFor + getBy*
  5. Never put side-effects in waitFor (no fireEvent/userEvent inside)
  6. One assertion per waitFor
  7. Never pass empty callbacks to waitFor
  8. Don't wrap in act() - render, fireEvent, userEvent handle it
  9. Don't call cleanup() - automatic after each test
  10. Prefer ARIA props (role, aria-label, aria-disabled) over legacy accessibility* props
  11. Use RNTL matchers over raw prop assertions

*ByRole Quick Reference

Common roles: button, text, heading (alias: header), searchbox, switch, checkbox, radio, img, link, alert, menu, menuitem, tab, tablist, progressbar, slider, spinbutton, timer, toolbar.

getByRole options: { name, disabled, selected, checked, busy, expanded, value: { min, max, now, text } }.

For *ByRole to match, the element must be an accessibility element:

  • Text, TextInput, Switch are by default
  • View needs accessible={true} (or use Pressable/TouchableOpacity)

waitFor

// Correct: action first, then wait for result
fireEvent.press(button);
await waitFor(() => {
  expect(screen.getByText('Result')).toBeOnTheScreen();
});

// Better: use findBy* instead
fireEvent.press(button);
expect(await screen.findByText('Result')).toBeOnTheScreen();

Options: waitFor(cb, { timeout: 1000, interval: 50 }). Works with Jest fake timers automatically.

Fake Timers

Recommended with userEvent (press/longPress involve real durations):

jest.useFakeTimers();

test('with fake timers', async () => {
  const user = userEvent.setup();
  render(<Component />);
  await user.press(screen.getByRole('button'));
  // ...
});

Custom Render

Wrap providers using wrapper option:

function renderWithProviders(ui: React.ReactElement) {
  return render(ui, {
    wrapper: ({ children }) => (
      <ThemeProvider>
        <AuthProvider>{children}</AuthProvider>
      </ThemeProvider>
    ),
  });
}

References

  • v13 API Reference — Complete v13 API: sync render, queries, matchers, userEvent, React 19 compat
  • v14 API Reference — Complete v14 API: async render, queries, matchers, userEvent, migration
  • Anti-Patterns — Common mistakes to avoid

Mehr Skills von callstackincubator

agent-device
callstackincubator
Automatisieren Sie iOS- und Android-App-Interaktionen mit Snapshot-basierter Erkennung und selektorgesteuerter Wiedergabe. Unterstützt iOS-Simulatoren/-Geräte und Android-Emulatoren/-Geräte mit sitzungsgebundener Automatisierung, Multi-Tenant-Remote-Daemon-Modus und Gerätebereichsisolierung für QA-Workflows. Kernbefehle: Snapshot für UI-Erkennung mit Referenzen, Press / Fill / Scroll für Interaktionen, Open / Close für den App-Lebenszyklus, Install / Reinstall für die Binärbereitstellung. Enthält Dienstprogramme für Protokollierung, Netzwerkinspektion,...
official
dogfood
callstackincubator
Systematisch eine mobile App auf iOS/Android mit Agent-Device erkunden und testen, um Bugs, UX-Probleme und andere Fehler zu finden. Verwenden, wenn aufgefordert zu dogfood, QA,…
official
react-devtools
callstackincubator
Untersuchen und Profilen von React Native-Komponentenbäumen vom Agent-Gerät aus. Verwenden für React Native-Performance, Profiling, Props, State, Hooks, Render-Ursachen, langsame…
official
react-devtools
callstackincubator
React DevTools CLI für KI-Agenten. Verwenden Sie dies, wenn der Benutzer Sie bittet, eine React- oder React Native-App zur Laufzeit zu debuggen, Komponenten-Props/State/Hooks zu inspizieren, zu diagnostizieren…
official
github
callstackincubator
GitHub-Workflow-Automatisierung über die gh CLI für Pull Requests, gestapelte PRs und Repository-Verwaltung. Bietet einen Workflow zum Zusammenführen gestapelter PRs: Squash-Merge des ersten PRs, dann Rebase und Aktualisierung des Basis-Branches für jeden nachfolgenden PR in der Kette. Enthält Konflikterkennung und manuelle Lösungsaufforderungen, um stille Fehler bei Multi-PR-Merges zu vermeiden. Deckt die wichtigsten gh CLI-Operationen ab: PR-Erstellung, Statusprüfungen, Squash/Rebase-Merging und Branch-Verwaltung. Optimiert für geringen Kontextverbrauch durch Nutzung der gh CLI...
official
github-actions
callstackincubator
GitHub Actions-Workflow-Muster für React Native iOS-Simulator- und Android-Emulator-Cloud-Builds mit herunterladbaren Artefakten. Verwenden Sie dies beim Einrichten von CI-Builds…
official
react-native-best-practices
callstackincubator
Strukturierte Leistungsoptimierungsreferenz für React Native-Apps, die FPS, Bundle-Größe, TTI und Speicher abdeckt. Organisiert in 9 JavaScript/React-Leitfäden (Profiling, Listen, Animationen, Speicher), 9 native Optimierungsleitfäden (Turbo Modules, Threading, Profiling) und 9 Bundling-Leitfäden (Tree Shaking, Code Splitting, Größenanalyse). Jede Referenz folgt einem hybriden Format mit schnellen Mustern/Befehlen, Auswirkungsbewertungen (KRITISCH/HOCH/MITTEL) und ausführlichen Erklärungen mit Voraussetzungen und allgemeinen...
official
react-native-brownfield-migration
callstackincubator
Bietet eine inkrementelle Einführungsstrategie zur Migration nativer iOS- oder Android-Apps zu React Native oder Expo unter Verwendung von @callstack/react-native-brownfield für die anfängliche…
official