Тестирование наблюдаемых полевых изменений в сопрограмме - PullRequest
1 голос
/ 06 февраля 2020

Я пишу модульные тесты, и у меня есть особый случай, когда я изменяю наблюдаемое значение перед выполнением функции приостановки, а затем сразу после. Я хотел бы написать модульный тест, чтобы проверить, правильно ли менялось значение дважды.

Вот метод:

 fun doSomething() {
            viewModelScope.launch(ioDispatcher) {
                try {
                    viewModelScope.launch(Dispatchers.Main) {
                        commandLiveData.value = Pair(CANCEL_TIMER, null)
                    }
                    isProgress.set(true) //need to test it was set to true in one test
                    checkoutInteractor.doSomethingElse().run {
                        handleResult(this)
                    }
                    isProgress.set(false) //need to test it was set to false here in another test
                } catch (ex: java.lang.Exception) {
                    handleHttpError(ex)
                    isProgress.set(false)
                }
            }
        }

При написании теста я звоню doSomething(), но Я не уверен, как определить, что значение было установлено в true перед checkoutInteractor.doSomethingElse Позвоните и установите значение false после.

Вот мой тест

@Test
    fun `test doSomething enables progress`() {
        runBlockingTest {
            doReturn(Response()).`when`(checkoutInteractor). checkoutInteractor.doSomethingElse()
            viewModel.doSomething()
            assertTrue(viewModel.isProgress.get()) //fails obviously as the value was already set to false after the `doSomethingElse` was executed. 
        }
    }

Кстати, isProgress - это ObservableBoolean

1 Ответ

0 голосов
/ 06 февраля 2020

Чтобы записать и проверить выполнение их методов, вам потребуется либо шутить, либо шпионить за полями isProgress и checkoutInteractor.

  1. Передать макет или шпион для isProcess и checkoutInteractor в ваш класс.
  2. Выполнение doSomething()
  3. Проверка inOrder set() и doSomethingElse() функций

Пример:

@Test
fun `test doSomething enables progress`() {
    runBlockingTest {
        val checkoutInteractor = Mockito.spy(CheckoutInteractor())
        val isProcess = Mockito.spy(ObservableBoolean(true))
        val viewModel = ViewModel(isProcess, checkoutInteractor)

        viewModel.doSomething()

        val inOrder = inOrder(isProcess, checkoutInteractor)
        inOrder.verify(isProcess).set(true)
        inOrder.verify(checkoutInteractor).doSomethingElse()
        inOrder.verify(isProcess).set(false)
    }
}
...