@testing-library/react-native
Version:
Simple and complete React Native testing utilities that encourage good testing practices.
62 lines (39 loc) • 2.62 kB
Markdown
# Troubleshooting
This guide describes common issues found by users when integrating React Native Test Library to their projects:
## Example repository
We maintain an [example repository](https://github.com/callstack/react-native-testing-library/tree/main/examples/basic) with a React Native Testing Library setup using TypeScript.
If something doesn't work in your setup, check this repository for configuration examples.
## Undefined component error
> Warning: React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined.
This frequently happens when you mock a complex module incorrectly, e.g.:
```ts
jest.mock('@react-navigation/native', () => {
return {
useNavigation: jest.fn(),
};
});
```
The above mock will mock `useNavigation` hook as intended, but at the same time all other exports from `@react-navigation/native` package are now `undefined`. If you want to use `NavigationContainer` component from the same package it will be `undefined` and result in the error above.
To mock only part of a package, re-export all other exports using `jest.requireActual`:
```ts
jest.mock('@react-navigation/native', () => {
return {
...jest.requireActual('@react-navigation/native'),
useNavigation: jest.fn(),
};
});
```
That way the mock will re-export all of the `@react-navigation/native` members and overwrite only the `useNavigation` hook.
Alternatively, you can use `jest.spyOn` to mock package exports selectively.
### Mocking React Native
When mocking the `react-native` package, don't mock the whole package at once, as this has issues with `jest.requireActual`. Mock specific library paths inside the package instead, e.g.:
```ts title=jest-setup.ts
jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');
```
## Act warnings
When writing tests you may encounter warnings connected with `act()` function. There are two kinds of these warnings:
- sync `act()` warning - `Warning: An update to Component inside a test was not wrapped in act(...)`
- async `act()` warning - `Warning: You called act(async () => ...) without await`
You can read more about `act()` function in our [understanding `act` function guide](./understanding-act.md).
Normally, you should not encounter sync `act()` warnings, but if that happens this probably indicate an issue with your test and should be investigated.
In case of async `act()` function this might happen more or less randomly, especially if your components contain async logic. So far this warning does not seem to affect test correctness.