首页 > 解决方案 > 在插桩测试中,如何在禁用网络时使 Cloud Firestore 写入命令成功?

问题描述

因此,我尝试仅将 Cloud Firestore 离线缓存用作我的仪器测试的 API,以避免在集成测试期间必须从服务器数据库读取和写入。

首先,在我的测试设置方法中,我调用了这个方法

protected fun setFirestoreToOfflineMode() {
    Tasks.await(FirebaseFirestore.getInstance().disableNetwork())
}

然后,在每个相关测试开始时,我使用

fun givenHasTrips(vararg trips: Trip) {
    GlobalScope.launch(Dispatchers.Default) {
        trips.forEach {
            firestoreTripApi.put(it)
        }
    }
}

在那个 put 方法中,我有以下代码:

try {
    Tasks.await(tripCollection().document(tripData.id).set(tripData)),
                    firestoreApiTimeoutSeconds, TimeUnit.SECONDS)
    Either.Right(Unit)
} catch (e: Throwable) {
    Either.Left(Failure.ServerError)
}

我正在调用 set() 方法并等待成功的结果,以便能够返回操作成功,然后更新我的 UI。

发生的情况是缓存数据库写入正确,但“set()”函数超时,因为数据库处于脱机模式。我读过 Firestore 仅在正确写入服务器数据库时才确认成功。如果是这种情况,我不知道在严格以离线缓存模式运行时是否可以让这个调用不超时。

是否有解决方案让 Firestore 将本地缓存数据库视为事实来源并在离线模式下返回成功,仅用于测试?

标签: firebasekotlingoogle-cloud-firestoreoffline-cachinginstrumented-test

解决方案


修改数据库的方法(设置、更新、删除)返回的任务仅在数据完全提交到云时才会发出回调。没有办法改变这种行为。

您可以做的是为预期更改的文档设置一个侦听器,然后等待侦听器触发。即使在离线时侦听器也会触发。


推荐阅读