Как проверить взаимодействие с меню при тестировании фрагментов с FragmentScenario - PullRequest
3 голосов
/ 01 декабря 2019

Я пытаюсь проверить фрагмент, используя 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, но он возвращает ноль. onCreateOptionsMenu не вызывается во время тестирования. Поэтому я не знаю, как проверить взаимодействие пользователя с меню.

1 Ответ

2 голосов
/ 01 декабря 2019

Я решил проблему, посмеявшись над пунктом меню:

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

//Create a mock for the menu item with the desired item id.
val addMenuItem = mock(MenuItem::class.java)
`when`(addMenuItem.itemId).thenReturn(R.id.action_add)

 //Call onOptionsItemSelected with the mocked menu item
 scenario.onFragment { fragment ->
       fragment.onOptionsItemSelected(addMenuItem)
 }

Это работает, но если у кого-то есть лучшее / альтернативное решение, буду рад услышать.

...