UNPKG

@testing-library/react-native

Version:

Simple and complete React Native testing utilities that encourage good testing practices.

95 lines (67 loc) 3.09 kB
# Other helpers ## `within` ```jsx function within(instance: TestInstance): Queries {} ``` `within` performs [queries](./queries.md) scoped to given element. > [!NOTE] > Please note that additional `render` specific operations like `rerender`, `unmount`, `debug`, `toJSON` are _not_ included. ```jsx const detailsScreen = within(screen.getByHintText('Details Screen')); expect(detailsScreen.getByText('Some Text')).toBeOnTheScreen(); expect(detailsScreen.getByDisplayValue('Some Value')).toBeOnTheScreen(); expect(detailsScreen.queryByLabelText('Some Label')).toBeOnTheScreen(); await expect(detailsScreen.findByHintText('Some Label')).resolves.toBeOnTheScreen(); ``` Use cases for scoped queries include: - queries scoped to a single item inside a FlatList containing many items - queries scoped to a single screen in tests involving screen transitions (e.g. with react-navigation) ## `act` ```ts function act<T>(callback: () => T | Promise<T>): Promise<T>; ``` Wraps code that causes React state updates to ensure all updates are processed before assertions. By default any `render`, `rerender`, `fireEvent`, and `waitFor` calls are wrapped by this function, so there is no need to wrap it manually. **In v14, `act` is now async by default and always returns a Promise**. This works with async React features like `Suspense` boundaries and the `use()` hook. All pending React updates are executed before the Promise resolves. ```ts import { act } from '@testing-library/react-native'; it('should update state', async () => { await act(() => { setState('new value'); }); expect(state).toBe('new value'); }); ``` **Note**: Even if your callback is synchronous, you should still use `await act(...)` as `act` now always returns a Promise. Consult our [Understanding Act function](../guides/understanding-act.md) document for more understanding of its intricacies. ## `cleanup` ```ts function cleanup(): Promise<void>; ``` Unmounts React trees that were mounted with `render` and clears `screen` variable that holds latest `render` output. > [!INFO] > Please note that this is done automatically if the testing framework you're using supports the `afterEach` global (like mocha, Jest, and Jasmine). If not, you will need to do manual cleanups after each test. For example, if you're using the `jest` testing framework, then you would need to use the `afterEach` hook like so: ```jsx import { cleanup, render } from '@testing-library/react-native/pure'; import { View } from 'react-native'; afterEach(async () => { await cleanup(); }); it('renders a view', async () => { await render(<View />); // ... }); ``` The `afterEach(cleanup)` call also works in `describe` blocks: ```jsx describe('when logged in', () => { afterEach(async () => { await cleanup(); }); it('renders the user', async () => { await render(<SiteHeader />); // ... }); }); ``` Failing to call `cleanup` when you've called `render` could result in a memory leak and tests which are not "idempotent" (which can lead to difficult to debug errors in your tests).