Как проверить взаимодействие с меню при тестировании фрагментов с помощью FragmentScenario

Я пытаюсь протестировать фрагмент с помощью FragmentScenario. Этот фрагмент имеет собственное меню. На панели действий есть значок добавления, и нажатие на этот пункт меню запускает дочерний фрагмент, из которого пользователь может добавлять новые элементы. Поэтому я пытаюсь проверить это поведение. Однако, как вы, возможно, знаете, FragmentScenario запускает фрагмент в рамках EmptyFragmentActivity, не запуская реальную активность хоста. Поскольку панель действий не является частью макета фрагмента, а принадлежит основной активности, панель действий и, следовательно, меню даже не становятся видимыми во время тестирования. Итак, как я могу протестировать взаимодействие с меню?

Я нашел эту часть информации из официальных документов:

Если вам нужно вызвать метод самого фрагмента, например, ответить на выбор в меню параметров, вы можете сделать это безопасно, реализуя FragmentAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<MyFragment>()
        scenario.onFragment(fragment ->
            fragment.onOptionsItemSelected(clickedItem) {
                //Update fragment's state based on selected item.
            }
        }
    }
}

Однако как передать правильный элемент обратному вызову onOptionsItemSelected? Я попытался определить addMenuItem как переменную-член и инициализировать ее внутри onCreateOptionsMenu, но она возвращает значение null. onCreateOptionsMenu не вызывается во время тестирования. Поэтому я не знаю, как проверить взаимодействие пользователя с меню.


person Oya Canli    schedule 01.12.2019    source источник


Ответы (1)


Я решил проблему, передав фиктивный пункт меню:

val scenario = launchFragmentInContainer<CategoryListFragment>(Bundle(), R.style.AppTheme)

//Create a dummy menu item with the desired item id.
val context: Context = ApplicationProvider.getApplicationContext<AndroidTestApplication>()
val addMenuItem = ActionMenuItem(context, 0, R.id.action_add, 0, 0, null)
 
 //Call onOptionsItemSelected with the dummy menu item
 scenario.onFragment { fragment ->
       fragment.onOptionsItemSelected(addMenuItem)
 }

РЕДАКТИРОВАТЬ: это решение спасло положение в то время. Но теперь я стал предпочитать помещать панель инструментов в макет фрагмента вместо активности, особенно если у меня разные меню для разных фрагментов, поэтому я не имею такой проблемы в других проектах. Это тоже возможное решение.

person Oya Canli    schedule 01.12.2019
comment
ОМГ спасибо! какое простое решение ГЛУПОЙ ГЛУПОЙ проблемы! - person or_dvir; 07.07.2020