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.