FragmentController против FragmentScenario

Роблектрик FragmentController позволили нам управлять жизненным циклом Fragmentв желаемое состояние. Кажется, чтоFragmentScenario всегда принимает Fragmentв тестируемом состоянии в возобновленное состояние. Можно было бы предположить, что призывmoveToState(CREATED) взял бы Fragment обратно через его onCreate(), но на самом деле, согласно документации,moveToState() имитирует внешнее приложение, взаимодействующее с Fragmentпод тестом. Это значит, чтоmoveToState(CREATED) перемещает Fragment под испытанием через onPause() а также onStop() как это было бы, когда новый Activity запущен.

Чтобы перевести фрагмент в другое состояние жизненного цикла, вызовите moveToState(). Эти методы поддерживают следующие состояния в качестве аргументов: CREATED, STARTED, RESUMED и DESTROYED. Это действие имитирует ситуацию, когда действие, содержащее ваш фрагмент, меняет свое состояние, поскольку оно прерывается другим приложением или действием системы.

Можно ли как-то направить FragmentScenario вести Fragment в желаемое состояние вместо того, чтобы всегда проходить onResume()? Как мы проверяем, что что-то произошло внутриonCreate() а не внутри onResume() с помощью FragmentScenario? Я что-то упустил?

1 ответ

Не уверен, почему вам нужно что-то тестировать во время onCreate фрагмента, но у меня был случай, чтобы снабдить мой фрагмент поддельной моделью просмотра (насмешка над счастливым случаем и т. Д.) - вы можете сделать это следующим образом:

@Test fun yetAnotherTest(){

    val fakeViewModel = YourViewModel(fakeDependency1, fakeDependency2,...)

    val scenario: FragmentScenario<YourFragment> =
        launchFragmentInContainer {
            YourFragment().apply {
                viewModel = fakeViewModel
            }
        }
}

и некоторые мелкие модификации

lateinit var viewmodel: YourViewModel

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    //if this is yetAnotherTest() run, line is skipped 
    if (!::viewModel.isInitialized) {
        //normal setup
        viewModel = provideYourViewModel()
    }

в качестве альтернативы вы можете предоставить FragmentFactory для своего фрагмента, чтобы вам было проще тестировать фрагменты с помощью FragmentScenario.

Другие вопросы по тегам