如何让 espresso 等待由 firebase 调用触发的 activity?
How to make espresso wait for activity that is triggered by a firebase call?
我有一个 LoginActivity
,它使用 firebase
作为后端。当我成功登录后,我的 MainActivity
成功显示。
如何为此 activity 更改编写 Espresso 测试?
Espresso 跟踪当前 activity 本身的普通方式似乎只适用于不需要等待 firebase 的活动。在使用 firebase auth 时使用它时,我收到此错误消息:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: (my application package):id/button2
(button2 是新 activity 中按钮的 ID,但无论我在新 activity 中尝试达到什么视图,都会发生这种情况)
我也尝试过使用 ActivityMonitor 和类似的方法。他们似乎根本没有提取任何 activity 零钱。
Thread.sleep()
给人的印象与我想做的完全相反:它似乎暂停了应用程序,而不是测试本身。
我知道我不应该测试 firebase 本身的功能,但我的应用程序在很大程度上依赖于登录的用户,我很想编写其他测试来测试 GUI
和已登录用户的功能。
如何在使用 firebaseauth
检查是否应该触发 activity 时为 activity 更改编写正确的浓缩咖啡测试?
您需要使用 IdlingResource class。 Espresso 无法判断您的 UI 何时正在等待 Firebase 等异步网络调用。 IdlingResource 正是为此目的而创建的。这是解决您问题的一种方法。
- 在您的代码中有一些东西可以在您等待网络呼叫时进行跟踪。可能是一个名为 isInProgress 的布尔值。
- 在与测试相同的文件夹中创建一个 IdlingResource class,如下所示:
示例:
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
}
}
- 在测试中注册 IdlingResource class @Before 函数,如下所示:
示例:
@get:Rule
val mActivityTestRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
@Before
fun init() { IdlingRegistry.getInstance()
.register(RegisterIdlingResource(mActivityTestRule.activity))
}
现在只要您的布尔值显示 isInProgress,Espresso 就会等待。
我有一个 LoginActivity
,它使用 firebase
作为后端。当我成功登录后,我的 MainActivity
成功显示。
如何为此 activity 更改编写 Espresso 测试?
Espresso 跟踪当前 activity 本身的普通方式似乎只适用于不需要等待 firebase 的活动。在使用 firebase auth 时使用它时,我收到此错误消息:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: (my application package):id/button2
(button2 是新 activity 中按钮的 ID,但无论我在新 activity 中尝试达到什么视图,都会发生这种情况)
我也尝试过使用 ActivityMonitor 和类似的方法。他们似乎根本没有提取任何 activity 零钱。
Thread.sleep()
给人的印象与我想做的完全相反:它似乎暂停了应用程序,而不是测试本身。
我知道我不应该测试 firebase 本身的功能,但我的应用程序在很大程度上依赖于登录的用户,我很想编写其他测试来测试 GUI
和已登录用户的功能。
如何在使用 firebaseauth
检查是否应该触发 activity 时为 activity 更改编写正确的浓缩咖啡测试?
您需要使用 IdlingResource class。 Espresso 无法判断您的 UI 何时正在等待 Firebase 等异步网络调用。 IdlingResource 正是为此目的而创建的。这是解决您问题的一种方法。
- 在您的代码中有一些东西可以在您等待网络呼叫时进行跟踪。可能是一个名为 isInProgress 的布尔值。
- 在与测试相同的文件夹中创建一个 IdlingResource class,如下所示:
示例:
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
}
}
- 在测试中注册 IdlingResource class @Before 函数,如下所示:
示例:
@get:Rule
val mActivityTestRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
@Before
fun init() { IdlingRegistry.getInstance()
.register(RegisterIdlingResource(mActivityTestRule.activity))
}
现在只要您的布尔值显示 isInProgress,Espresso 就会等待。