Проблема с NavController при попытке запустить EspressoTest - PullRequest
0 голосов
/ 27 июня 2019

Я получаю эту ошибку:

IllegalStateException: просмотр android.widget.LinearLayout {649700d В.Е ...... ...... я. 0,0-0,0} не имеет установленного NavController

Но это происходит только на эспрессо-тестах. Код, где происходит сбой, обрабатывает onBackPressed с моим фрагментом:

val navController = Navigation.findNavController(view)//this line here
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.homeFragment, false)
            }
        })

Это мой эспрессо-тест:

    @Test
    fun testBackButton() {
        val mockNavController = mock(NavController::class.java)
        settingsFragmentScenario = launchFragmentInContainer()
        settingsFragmentScenario.onFragment {
            Navigation.setViewNavController(it.requireView(), mockNavController)
        }
        performClickOnViews(android.R.id.home)
        verify(mockNavController).navigate(R.id.home)
    }

Если я удаляю свой код во фрагменте, тесты запускаются без каких-либо ошибок (за исключением того, что я утверждаю неправильно)

Я проверил: IllegalStateException: Link не имеет установленного NavController , но его / ее проблема не такая, как у меня.

PS: в рабочем коде эта строка не падает

1 Ответ

0 голосов
/ 27 июня 2019

Мне удалось решить эту проблему, заменив:

val navController = Navigation.findNavController(view)//this line here
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.homeFragment, false)
            }
        })

на:

requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                view.findNavController().popBackStack(R.id.homeFragment, false)
            }
        })

Расширение, навигационный контроллер установлен на виде в моем тесте с использованием setViewNavController,таким образом, я должен был изменить свой производственный код :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...