【发布时间】:2022-08-14 02:08:35
【问题描述】:
我正在尝试使用 Firebase Auth 和 Firestore 模拟器进行测试,但我真正的 Firebase 应用程序用于开发。我有用于依赖注入的 Hilt。在我的测试模块中,我设置了useEmulator,但在我的开发模块中,我只使用了 Firebase 单例。事实证明,开发仍在使用模拟器,因为单例在测试和开发之间共享。如何在开发模块中断开与模拟器的连接?
开发模块:
@Module
@InstallIn(SingletonComponent::class)
object FirebaseModule {
@Singleton
@Provides
fun provideAuth(): FirebaseAuth = Firebase.auth
@Singleton
@Provides
fun provideDb(): FirebaseFirestore = Firebase.firestore
}
测试模块:
@Module
@TestInstallIn(components = [SingletonComponent::class], replaces = [FirebaseModule::class])
object FakeFirebaseModule {
private val TAG = FakeFirebaseModule::class.simpleName
@Singleton
@Provides
fun provideAuth(): FirebaseAuth = Firebase.auth.apply {
try {
useEmulator(\"10.0.2.2\", 9099)
} catch (e: IllegalStateException) {
Log.e(TAG, \"User emulator failed\", e)
}
}
@Singleton
@Provides
fun provideDb(): FirebaseFirestore = Firebase.firestore.apply {
try {
useEmulator(\"10.0.2.2\", 8080)
} catch (e: IllegalStateException) {
Log.e(TAG, \"User emulator failed\", e)
}
firestoreSettings = FirebaseFirestoreSettings.Builder().setPersistenceEnabled(false).build()
}
}
测试:
@UninstallModules(FirebaseModule::class)
@HiltAndroidTest
@MediumTest
class ExampleTest {
private val hiltRule = HiltAndroidRule(this)
private val composeTestRule = createAndroidComposeRule<MainActivity>()
@get:Rule
val rule: TestRule = RuleChain.outerRule(hiltRule).around(composeTestRule)
@Inject
lateinit var auth: FirebaseAuth
@Inject
lateinit var db: FirebaseFirestore
@Before
fun setUp() {
hiltRule.inject()
auth.createUserWithEmailAndPassword(TestData.UserEmail1, TestData.UserPassword1)
.addOnFailureListener {
auth.signInWithEmailAndPassword(TestData.UserEmail1, TestData.UserPassword1)
}
}
// ...
}
标签: android firebase kotlin dagger-hilt firebase-tools