This example shows how to write integration tests using React Navigation without mocking it. Presented approach has been consulted with and influenced by React Navigation team.
There are two types of recommeded tests:
- Tests operating on navigator level - these use
renderNavigator
helper to render a navigator component used in the app. It is useful when you want to test a scenario that includes multiple screens. - Tests operating on single screen level - these use regular
render
helper but require refactoring screen components intoScreen
andScreenContent
components. WhereScreen
receives React Navigation props and/or uses hooks likeuseNavigation
whileScreenContent
does not have a direct relation to React Navigation API but gets props fromScreen
and calls relevant callbacks to trigger navigation.
Note that this example applies
includeHiddenElements: false
by default, so all queries will ignore elements on the hidden screens, e.g. inactive tabs or screens present in stack navigators. This option is enabled injest-setup.js
file, usingdefaultIncludeHiddenElements: false
option toconfigure
function.
There also exists another popular type of screen level tests, where users mock React Navigation objects like navigation
, route
and/or hooks like useNavigation
, etc. We don't recommend this way of testing. Mocking internal parts of the libraries is effectively testing implementation details, which goes against the Testing Library's Guiding Principles.