FragmentController vs FragmentScenario - PullRequest
       14

FragmentController vs FragmentScenario

1 голос
/ 12 марта 2020

Roblectri c 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 Ответ

0 голосов
/ 21 марта 2020

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

@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.

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