Skip to content

Commit abfc7b3

Browse files
committed
add more examples
1 parent 20ff1fb commit abfc7b3

File tree

1 file changed

+98
-7
lines changed

1 file changed

+98
-7
lines changed

versioned_docs/version-7.x/testing.md

Lines changed: 98 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ If you're not using Jest, then you'll need to mock these modules according to th
7474

7575
We recommend using [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) along with [`jest-native`](https://github.com/testing-library/jest-native) to write your tests.
7676

77-
We are going to write example tests for Root Navigator defined below:
77+
We are going to write example tests illustrating difference between navigate and push functions using Root Navigator defined below:
7878

7979
<Tabs groupId="example" queryString="example">
8080
<TabItem value="static" label="Static" default>
@@ -98,6 +98,10 @@ const Profile = ({ navigation }) => {
9898
onPress={() => navigation.navigate('Settings')}
9999
title="Navigate to Settings"
100100
/>
101+
<Button
102+
onPress={() => navigation.push('Settings')}
103+
title="Push Settings"
104+
/>
101105
<Button
102106
onPress={() => setTimeout(() => navigation.navigate('Settings'), 10000)}
103107
title="Navigate to Settings with 10000 ms delay"
@@ -128,7 +132,7 @@ export const RootNavigator = () => {
128132
</TabItem>
129133
</Tabs>
130134

131-
Test Example:
135+
Navigate function test example:
132136

133137
<Tabs groupId="example" queryString="example">
134138
<TabItem value="static" label="Static" default>
@@ -146,15 +150,64 @@ import { fireEvent, render, screen } from '@testing-library/react-native';
146150
import { NavigationContainer } from '@react-navigation/native';
147151
import { RootNavigator } from './RootNavigator';
148152

149-
test('shows settings screen when Navigate to Settings is pressed', () => {
153+
test('navigates to settings screen twice', async () => {
154+
const navigation = createNavigationContainerRef();
150155
render(
151-
<NavigationContainer>
156+
<NavigationContainer ref={navigation}>
152157
<RootNavigator />
153158
</NavigationContainer>
154159
);
155160

156-
fireEvent.press(screen.getByText('Navigate to Settings'));
157-
expect(screen.getByText('Settings')).toBeOnTheScreen();
161+
const button = screen.getByText('Navigate to Settings');
162+
fireEvent.press(button);
163+
fireEvent.press(button);
164+
165+
expect(navigation.getState().routes.map((route) => route.name)).toStrictEqual(
166+
['Profile', 'Settings']
167+
);
168+
expect(screen.queryByText('Profile')).not.toBeOnTheScreen();
169+
expect(screen.queryByText('Settings')).toBeOnTheScreen();
170+
});
171+
```
172+
173+
</TabItem>
174+
</Tabs>
175+
176+
Push function test example:
177+
178+
<Tabs groupId="example" queryString="example">
179+
<TabItem value="static" label="Static" default>
180+
181+
```js
182+
183+
```
184+
185+
</TabItem>
186+
<TabItem value="dynamic" label="Dynamic">
187+
188+
```js
189+
import { expect, test } from '@jest/globals';
190+
import { fireEvent, render, screen } from '@testing-library/react-native';
191+
import { NavigationContainer } from '@react-navigation/native';
192+
import { RootNavigator } from './RootNavigator';
193+
194+
test('pushes settings screen twice', async () => {
195+
const navigation = createNavigationContainerRef();
196+
render(
197+
<NavigationContainer ref={navigation}>
198+
<RootNavigator />
199+
</NavigationContainer>
200+
);
201+
202+
const button = screen.getByText('Push Settings');
203+
fireEvent.press(button);
204+
fireEvent.press(button);
205+
206+
expect(navigation.getState().routes.map((route) => route.name)).toStrictEqual(
207+
['Profile', 'Settings', 'Settings']
208+
);
209+
expect(screen.queryByText('Profile')).not.toBeOnTheScreen();
210+
expect(screen.queryByText('Settings')).toBeOnTheScreen();
158211
});
159212
```
160213

@@ -163,7 +216,45 @@ test('shows settings screen when Navigate to Settings is pressed', () => {
163216

164217
For writing tests that include times functions you will need to use [Fake Timers](https://jestjs.io/docs/timer-mocks). They will replace times function implementation to use time from the fake clock.
165218

166-
Test Example:
219+
Let's add another button to the Profile screen which uses `setTimeout`:
220+
221+
<Tabs groupId="example" queryString="example">
222+
<TabItem value="static" label="Static" default>
223+
224+
```js
225+
226+
```
227+
228+
</TabItem>
229+
<TabItem value="dynamic" label="Dynamic">
230+
231+
```js
232+
const Profile = ({ navigation }) => {
233+
return (
234+
<View>
235+
<Text>Profile</Text>
236+
<Button
237+
onPress={() => navigation.navigate('Settings')}
238+
title="Navigate to Settings"
239+
/>
240+
<Button
241+
onPress={() => navigation.push('Settings')}
242+
title="Push Settings"
243+
/>
244+
// Added button
245+
<Button
246+
onPress={() => setTimeout(() => navigation.navigate('Settings'), 10000)}
247+
title="Navigate to Settings with 10000 ms delay"
248+
/>
249+
</View>
250+
);
251+
};
252+
```
253+
254+
</TabItem>
255+
</Tabs>
256+
257+
Fake timers test example:
167258

168259
<Tabs groupId="example" queryString="example">
169260
<TabItem value="static" label="Static" default>

0 commit comments

Comments
 (0)