LLM Guidelines for React Native Testing Library
Actionable guidelines for writing tests with React Native Testing Library (RNTL) v14.
Core APIs
render
screen
Prefer screen over destructuring from render(). Provides all query methods after render() is called.
renderHook
Query Selection
- Prefer
getByRoleas first choice for querying elements - Query priority:
getByRole→getByLabelText→getByPlaceholderText→getByText→getByDisplayValue→getByTestId(last resort) - Use
findBy*for elements that appear asynchronously (after API calls, timeouts, state updates) - Use
queryBy*ONLY for checking non-existence (with.not.toBeOnTheScreen()) - Never use
getBy*for non-existence checks - Avoid
container.queryAll()- usescreenqueries instead - Query by visible text, not
testIDwhen text is available
Assertions
- Use RNTL matchers - prefer semantic matchers over prop assertions
- Combine queries with matchers:
expect(screen.getByText('Hello')).toBeOnTheScreen() - No redundant null checks -
getBy*already throws if not found
Jest Matchers Reference
User Interactions
Prefer userEvent over fireEvent for realistic user interaction simulation. userEvent triggers the complete event sequence that real users would produce.
userEvent (Preferred)
fireEvent (Low-level)
Use only when userEvent doesn't support the event or when you need direct control.
Async/Await (v14)
- Always
await:render(),fireEvent.*,renderHook(),userEvent.* - Make test functions
async:test('name', async () => { ... }) - Don't wrap in
act()-renderandfireEventhandle it internally
waitFor Usage
- Use
findBy*instead ofwaitFor+getBy*when waiting for elements - Never perform side-effects (like
fireEvent.press()) insidewaitForcallbacks - One assertion per
waitForcallback - Never pass empty callbacks - always include a meaningful assertion
- Place side-effects before
waitFor- perform actions, then wait for result
Code Organization
- Use
screeninstead of destructuring fromrender():screen.getByText()notconst { getByText } = render() - Prefer
userEventoverfireEventfor realistic interactions - Don't use
cleanup()- handled automatically - Name wrappers descriptively:
ThemeProvidernotWrapper - Install ESLint plugin:
eslint-plugin-testing-library
Quick Checklist
- ✅ Using
getByRoleas first choice? - ✅ Using
awaitfor all async operations? - ✅ Using
findBy*for async elements (notwaitFor+getBy*)? - ✅ Using
queryBy*only for non-existence? - ✅ Using RNTL matchers (
toBeOnTheScreen(),toBeDisabled(), etc.)? - ✅ Using
screennot destructuring fromrender()? - ✅ Avoiding side-effects in
waitFor? - ✅ Using
userEventwhen appropriate?
Example: Good Pattern
Example: Anti-Patterns
By following these guidelines, your tests will be more maintainable, accessible, and reliable.
