Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何让浓缩咖啡等待firebase呼叫触发的活动?_Android_Firebase_Firebase Realtime Database_Android Espresso - Fatal编程技术网

Android 如何让浓缩咖啡等待firebase呼叫触发的活动?

Android 如何让浓缩咖啡等待firebase呼叫触发的活动?,android,firebase,firebase-realtime-database,android-espresso,Android,Firebase,Firebase Realtime Database,Android Espresso,我有一个LoginActivity,它使用firebase作为后端。成功登录后,我的main活动将成功显示 如何编写此活动变化的浓缩咖啡测试? 普通的方法是,浓缩咖啡跟踪当前的活动本身似乎只对不需要等待firebase的活动起作用。使用firebase auth时,我收到以下错误消息: android.support.test.espresso.NoMatchingViewException:在层次结构中找不到匹配的视图:id:(我的应用程序包):id/button2 (button2是新活动中

我有一个
LoginActivity
,它使用
firebase
作为后端。成功登录后,我的
main活动
将成功显示

如何编写此活动变化的浓缩咖啡测试?

普通的方法是,浓缩咖啡跟踪当前的活动本身似乎只对不需要等待firebase的活动起作用。使用firebase auth时,我收到以下错误消息:

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

(button2是新活动中按钮的id,但无论我在新活动中尝试访问哪个视图,都会发生这种情况)

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

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

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


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

您需要使用IdlingResource类。Espresso无法判断用户界面何时正在等待Firebase等异步网络调用。IdlingResource就是为了这个目的而创建的。这里有一个方法可以解决你的问题

  • 在您的代码中有一些东西可以跟踪您等待网络呼叫的时间。可能是一个叫做isInProgress的布尔值
  • 在与测试相同的文件夹中创建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
        }
    }
    
    @get:Rule
    val mActivityTestRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
    
    @Before
    fun init() { IdlingRegistry.getInstance()
        .register(RegisterIdlingResource(mActivityTestRule.activity))
    }
    
    导入android.support.test.espresso.IdlingResource
    导入com.myexample.main活动
    类LoginIdlingResource构造函数(
    私有val mainActivity:mainActivity
    ):idlingsource{
    私有变量resourceCallback:IdlingResource.resourceCallback?=null
    重写fun getName():字符串{
    return LoginIdlingResource::class.java.name
    }
    重写isIdleNow():布尔值{
    
    return!mainActivity.isInProgress()//您可以将Firebase代码隐藏在接口后面,并提供模拟实现,该实现将立即返回进行浓缩咖啡测试。嗯,我希望避免模拟,但我想这是不可避免的。@AleksanderMielczarek是否愿意用您的解决方案给出答案?这将非常有帮助!