如何让浓缩咖啡等待由 firebase 调用触发的活动?

Ali*_*old 5 android firebase android-espresso firebase-realtime-database

我有一个LoginActivityfirebase用作后端。当我成功登录后,我的MainActivity显示成功。

如何针对此活动更改编写 Espresso 测试?

Espresso 跟踪当前活动本身的普通方式似乎只适用于不需要等待 firebase 的活动。在使用 firebase auth 时使用它时,我收到此错误消息:

android.support.test.espresso.NoMatchingViewException:在层次结构中没有找到匹配的视图:id:(我的应用程序包):id/button2

(button2 是新活动中按钮的 id,但这发生在我试图在新活动中到达的任何视图)

我也尝试使用 ActivityMonitor 和类似的方法。它们似乎根本没有获取任何活动更改。

Thread.sleep() 给人的印象与我想做的完全相反:它似乎暂停了应用程序,而不是测试本身。

我知道我不应该测试 firebase 本身的功能,但是我的应用程序在很大程度上依赖于登录的用户,而且我稍后会编写其他测试来测试GUI已登录用户的功能。

firebaseauth用于检查是否应该触发活动时,如何为活动变化编写正确的浓缩咖啡测试?

sza*_*ske 2

您需要使用 IdlingResource 类。Espresso 无法判断您的 UI 何时正在等待异步网络调用(例如 Firebase)。IdlingResource 正是为此目的而创建的。这是解决您的问题的一种方法。

  1. 在您的代码中,有一些东西可以在您等待网络调用时进行跟踪。也许是一个名为 isInProgress 的布尔值。
  2. 在与测试相同的文件夹中创建一个 IdlingResource 类,如下所示:

例子:

import android.support.test.espresso.IdlingResource
import com.myexample.MainActivity


class LoginIdlingResource constructor(
        private val mainActivity: MainActivity
) : IdlingResource{

    private var resourceCallback: IdlingResource.ResourceCallback? = null

    override fun getName(): String {
        return LoginIdlingResource::class.java.name
    }

    override fun isIdleNow(): Boolean {
        return !mainActivity.isInProgress() // <----- Important part
    }

    override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
        this.resourceCallback = callback
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在测试 @Before 函数中注册 IdlingResource 类,如下所示:

例子:

@get:Rule
val mActivityTestRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)

@Before
fun init() { IdlingRegistry.getInstance()
    .register(RegisterIdlingResource(mActivityTestRule.activity))
}
Run Code Online (Sandbox Code Playgroud)

现在,只要您的布尔值显示 isInProgress,Espresso 就会等待。