Как заставить эспрессо ждать активности, которая вызывается пожарным вызовом? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть LoginActivity, который использует firebase в качестве серверной части. После успешного входа мой MainActivity успешно появляется.

Как мне написать эспрессо-тест для этого изменения активности?

Обычный способ, которым Espresso отслеживает саму текущую активность, кажется, работает только над действиями, которые не должны ждать возникновения огня. При использовании его при использовании Firebase Auth, я получаю это сообщение об ошибке:

android.support.test.espresso.NoMatchingViewException: не найдено подходящих представлений в иерархии: с id: (мой пакет приложения): id / button2

(button2 - это идентификатор кнопки в новом действии, но это происходит с любым видом, который я пытаюсь открыть в новом действии)

Я также пытался использовать ActivityMonitor и аналогичные методы. Похоже, они вообще не приносят никаких изменений в активности.

Thread.sleep() производит впечатление совершенно противоположного тому, что я хочу сделать: кажется, что приложение приостанавливается, а не сам тест.

Мне известно, что я не должен тестировать функциональность самой firebase, но мое приложение в значительной степени зависит от пользователя, вошедшего в систему, и я бы не стал писать другие тесты, которые тестируют GUI и функциональность для пользователей. которые вошли в систему.

Как написать правильный эспрессо-тест для изменения активности при использовании firebaseauth, чтобы проверить, должен ли я запускать активность?

1 Ответ

0 голосов
/ 15 ноября 2018

Вам необходимо использовать класс IdlingResource. Espresso не может определить, когда ваш пользовательский интерфейс ожидает асинхронного сетевого вызова, такого как 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. Зарегистрируйте класс IdlingResource в своих тестах для функции @Before следующим образом:

Пример:

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

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

Теперь Espresso будет ждать, когда ваш логический элемент скажет isInProgress.

...