瀏覽代碼

react must be mocked in the unit tests

Daniel Zlotin 8 年之前
父節點
當前提交
b7af16c217

+ 71
- 3
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java 查看文件

1
 package com.reactnativenavigation;
1
 package com.reactnativenavigation;
2
 
2
 
3
+import android.app.Activity;
3
 import android.app.Application;
4
 import android.app.Application;
5
+import android.os.Bundle;
4
 
6
 
5
 import com.facebook.react.ReactApplication;
7
 import com.facebook.react.ReactApplication;
6
 import com.facebook.react.ReactNativeHost;
8
 import com.facebook.react.ReactNativeHost;
9
+import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
7
 import com.reactnativenavigation.react.NavigationReactNativeHost;
11
 import com.reactnativenavigation.react.NavigationReactNativeHost;
8
 
12
 
9
 public abstract class NavigationApplication extends Application implements ReactApplication {
13
 public abstract class NavigationApplication extends Application implements ReactApplication {
10
 	public static NavigationApplication instance;
14
 	public static NavigationApplication instance;
11
-	private ReactNativeHost host;
15
+
16
+	public static class Config {
17
+		public final ReactNativeHost reactNativeHost;
18
+		public final ActivityLifecycleDelegate activityLifecycleDelegate;
19
+
20
+		public Config(ReactNativeHost reactNativeHost, ActivityLifecycleDelegate activityLifecycleDelegate) {
21
+			this.reactNativeHost = reactNativeHost;
22
+			this.activityLifecycleDelegate = activityLifecycleDelegate;
23
+		}
24
+	}
25
+
26
+	private Config config;
12
 
27
 
13
 	@Override
28
 	@Override
14
 	public void onCreate() {
29
 	public void onCreate() {
15
 		super.onCreate();
30
 		super.onCreate();
16
 		instance = this;
31
 		instance = this;
17
-		host = new NavigationReactNativeHost(this);
32
+
33
+		config = createConfig();
34
+
35
+		registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
36
+			@Override
37
+			public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
38
+				config().activityLifecycleDelegate.onActivityCreated(activity);
39
+			}
40
+
41
+			@Override
42
+			public void onActivityStarted(Activity activity) {
43
+
44
+			}
45
+
46
+			@Override
47
+			public void onActivityResumed(Activity activity) {
48
+				config().activityLifecycleDelegate.onActivityResumed(activity, (DefaultHardwareBackBtnHandler) activity);
49
+			}
50
+
51
+			@Override
52
+			public void onActivityPaused(Activity activity) {
53
+				config().activityLifecycleDelegate.onActivityPaused(activity);
54
+			}
55
+
56
+			@Override
57
+			public void onActivityStopped(Activity activity) {
58
+
59
+			}
60
+
61
+			@Override
62
+			public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
63
+
64
+			}
65
+
66
+			@Override
67
+			public void onActivityDestroyed(Activity activity) {
68
+				config().activityLifecycleDelegate.onActivityDestroyed(activity);
69
+			}
70
+		});
18
 	}
71
 	}
19
 
72
 
20
 	@Override
73
 	@Override
21
 	public ReactNativeHost getReactNativeHost() {
74
 	public ReactNativeHost getReactNativeHost() {
22
-		return host;
75
+		return config().reactNativeHost;
23
 	}
76
 	}
24
 
77
 
25
 	public abstract boolean isDebug();
78
 	public abstract boolean isDebug();
79
+
80
+	public Config config() {
81
+		return config;
82
+	}
83
+
84
+	/**
85
+	 * override this to inject your own configuration
86
+	 *
87
+	 * @return the Config
88
+	 */
89
+	protected Config createConfig() {
90
+		ReactNativeHost reactNativeHost = new NavigationReactNativeHost(this, isDebug());
91
+		ActivityLifecycleDelegate activityLifecycleDelegate = new ActivityLifecycleDelegate(reactNativeHost.getReactInstanceManager());
92
+		return new Config(reactNativeHost, activityLifecycleDelegate);
93
+	}
26
 }
94
 }

+ 5
- 11
android/app/src/main/java/com/reactnativenavigation/controllers/ActivityLifecycleDelegate.java 查看文件

12
 
12
 
13
 public class ActivityLifecycleDelegate {
13
 public class ActivityLifecycleDelegate {
14
 
14
 
15
-	private final Activity activity;
16
-	private final DefaultHardwareBackBtnHandler backBtnHandler;
17
 	private final ReactInstanceManager reactInstanceManager;
15
 	private final ReactInstanceManager reactInstanceManager;
18
 	private final AtomicBoolean appLaunchEmitted = new AtomicBoolean(false);
16
 	private final AtomicBoolean appLaunchEmitted = new AtomicBoolean(false);
19
 
17
 
20
-	public ActivityLifecycleDelegate(Activity activity,
21
-	                                 DefaultHardwareBackBtnHandler backBtnHandler,
22
-	                                 ReactInstanceManager reactInstanceManager) {
23
-		this.activity = activity;
24
-		this.backBtnHandler = backBtnHandler;
18
+	public ActivityLifecycleDelegate(ReactInstanceManager reactInstanceManager) {
25
 		this.reactInstanceManager = reactInstanceManager;
19
 		this.reactInstanceManager = reactInstanceManager;
26
 	}
20
 	}
27
 
21
 
28
-	public void onActivityCreated() {
22
+	public void onActivityCreated(Activity activity) {
29
 		appLaunchEmitted.set(false);
23
 		appLaunchEmitted.set(false);
30
 	}
24
 	}
31
 
25
 
32
-	public void onActivityResumed() {
26
+	public void onActivityResumed(Activity activity, DefaultHardwareBackBtnHandler backBtnHandler) {
33
 		if (ReactDevPermission.shouldAskPermission()) {
27
 		if (ReactDevPermission.shouldAskPermission()) {
34
 			ReactDevPermission.askPermission(activity);
28
 			ReactDevPermission.askPermission(activity);
35
 		} else {
29
 		} else {
38
 		}
32
 		}
39
 	}
33
 	}
40
 
34
 
41
-	public void onActivityPaused() {
35
+	public void onActivityPaused(Activity activity) {
42
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
36
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
43
 			reactInstanceManager.onHostPause(activity);
37
 			reactInstanceManager.onHostPause(activity);
44
 		}
38
 		}
45
 	}
39
 	}
46
 
40
 
47
-	public void onActivityDestroyed() {
41
+	public void onActivityDestroyed(Activity activity) {
48
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
42
 		if (reactInstanceManager.hasStartedCreatingInitialContext()) {
49
 			reactInstanceManager.onHostDestroy(activity);
43
 			reactInstanceManager.onHostDestroy(activity);
50
 		}
44
 		}

+ 8
- 4
android/app/src/main/java/com/reactnativenavigation/react/NavigationReactNativeHost.java 查看文件

1
 package com.reactnativenavigation.react;
1
 package com.reactnativenavigation.react;
2
 
2
 
3
+import android.app.Application;
4
+
3
 import com.facebook.react.ReactNativeHost;
5
 import com.facebook.react.ReactNativeHost;
4
 import com.facebook.react.ReactPackage;
6
 import com.facebook.react.ReactPackage;
5
 import com.facebook.react.shell.MainReactPackage;
7
 import com.facebook.react.shell.MainReactPackage;
6
-import com.reactnativenavigation.NavigationApplication;
7
 
8
 
8
 import java.util.Arrays;
9
 import java.util.Arrays;
9
 import java.util.List;
10
 import java.util.List;
10
 
11
 
11
 public class NavigationReactNativeHost extends ReactNativeHost {
12
 public class NavigationReactNativeHost extends ReactNativeHost {
12
-	public NavigationReactNativeHost(NavigationApplication application) {
13
+	private boolean isDebug;
14
+
15
+	public NavigationReactNativeHost(Application application, boolean isDebug) {
13
 		super(application);
16
 		super(application);
17
+		this.isDebug = isDebug;
14
 	}
18
 	}
15
 
19
 
16
 	@Override
20
 	@Override
17
 	public boolean getUseDeveloperSupport() {
21
 	public boolean getUseDeveloperSupport() {
18
-		return NavigationApplication.instance.isDebug();
22
+		return isDebug;
19
 	}
23
 	}
20
 
24
 
21
 	@Override
25
 	@Override
22
 	protected List<ReactPackage> getPackages() {
26
 	protected List<ReactPackage> getPackages() {
23
-		return Arrays.asList(
27
+		return Arrays.<ReactPackage>asList(
24
 				new MainReactPackage(),
28
 				new MainReactPackage(),
25
 				new NavigationPackage()
29
 				new NavigationPackage()
26
 		);
30
 		);

+ 1
- 1
android/app/src/test/AndroidManifest.xml 查看文件

2
           package="com.reactnativenavigation">
2
           package="com.reactnativenavigation">
3
 
3
 
4
     <application
4
     <application
5
-        android:name=".mocks.TestApplication"
5
+        android:name=".TestApplication"
6
         android:theme="@style/Theme.AppCompat.Light">
6
         android:theme="@style/Theme.AppCompat.Light">
7
     </application>
7
     </application>
8
 </manifest>
8
 </manifest>

+ 13
- 1
android/app/src/test/java/com/reactnativenavigation/NavigationApplicationTest.java 查看文件

1
 package com.reactnativenavigation;
1
 package com.reactnativenavigation;
2
 
2
 
3
 import com.facebook.react.ReactApplication;
3
 import com.facebook.react.ReactApplication;
4
+import com.reactnativenavigation.controllers.ActivityLifecycleDelegate;
4
 
5
 
5
 import org.junit.Test;
6
 import org.junit.Test;
6
 import org.robolectric.RuntimeEnvironment;
7
 import org.robolectric.RuntimeEnvironment;
21
 	}
22
 	}
22
 
23
 
23
 	@Test
24
 	@Test
24
-	public void singleInstance() throws Exception {
25
+	public void singleGlobalInstance() throws Exception {
25
 		assertThat(RuntimeEnvironment.application).isSameAs(NavigationApplication.instance);
26
 		assertThat(RuntimeEnvironment.application).isSameAs(NavigationApplication.instance);
26
 	}
27
 	}
28
+
29
+	@Test
30
+	public void providesConfiguration() throws Exception {
31
+		assertThat(NavigationApplication.instance.config()).isInstanceOf(NavigationApplication.Config.class);
32
+	}
33
+
34
+	@Test
35
+	public void configProvidesActivityLifecycleDelegate() throws Exception {
36
+		NavigationApplication.Config config = NavigationApplication.instance.config();
37
+		assertThat(config.activityLifecycleDelegate).isInstanceOf(ActivityLifecycleDelegate.class);
38
+	}
27
 }
39
 }

+ 10
- 0
android/app/src/test/java/com/reactnativenavigation/TestApplication.java 查看文件

1
+package com.reactnativenavigation;
2
+
3
+public class TestApplication extends NavigationApplication {
4
+
5
+	@Override
6
+	public boolean isDebug() {
7
+		return true;
8
+	}
9
+
10
+}

+ 0
- 11
android/app/src/test/java/com/reactnativenavigation/mocks/TestApplication.java 查看文件

1
-package com.reactnativenavigation.mocks;
2
-
3
-import com.reactnativenavigation.BuildConfig;
4
-import com.reactnativenavigation.NavigationApplication;
5
-
6
-public class TestApplication extends NavigationApplication {
7
-	@Override
8
-	public boolean isDebug() {
9
-		return BuildConfig.DEBUG;
10
-	}
11
-}