如何使espresso等待firebase调用触发的活动?

时间:2018-04-30 08:11:30

标签: android firebase firebase-realtime-database android-espresso

我有一个LoginActivity,它使用firebase作为后端。我成功登录后,MainActivity成功显示。

如何为此活动更改撰写Espresso测试?

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

  

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

(button2是新活动中按钮的ID,但这种情况会发生在我尝试在新活动中看到的任何视图中)

我也尝试过使用ActivityMonitor和类似的方法。他们似乎根本没有取得任何活动变化。

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

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

在使用firebaseauth检查是否应触发活动时,如何为活动更改编写正确的espresso测试?

1 个答案:

答案 0 :(得分:1)

您需要使用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
    }
}
  1. 像这样在测试@Before函数中注册IdlingResource类:

示例:

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

@Before
fun init() { IdlingRegistry.getInstance()
    .register(RegisterIdlingResource(mActivityTestRule.activity))
}

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