Сопрограммы проверяют, когда генерируется два события, а состояние устанавливается и сбрасывается.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Сопрограммы проверяют, когда генерируется два события, а состояние устанавливается и сбрасывается.

Сообщение Anonymous »

Код для тестирования
fun updateAccount() {
coroutineScope.launch {
startLoading()
val isAccountUpdated = updateAccountUseCase()
if (isAccountUpdated) {
navigator.navigateUp()
} else {
completeLoading()
// TODO: Show Error
}
}
}

Для контекста
val refreshSignal: MutableSharedFlow = MutableSharedFlow(
replay = 0,
extraBufferCapacity = 1,
)
fun startLoading() {
isLoading = true
refreshSignal.tryEmit(Unit)
}
fun completeLoading() {
isLoading = false
refreshSignal.tryEmit(Unit)
}

Успешная проверка
@Test
fun `updateAccount when updateAccountUseCase returns true`() = testScope.runTest {
whenever(updateAccountUseCase()).thenReturn(true)

SUT.refreshSignal.test {
SUT.updateAccount()

assertEquals(Unit, awaitItem())
assertEquals(true, SUT.isLoading)
verify(navigator).navigateUp()
expectNoEvents()
}
}

Тест не пройден
@Test
fun `updateAccount when updateAccountUseCase returns false`() = testScope.runTest {
whenever(updateAccountUseCase()).thenReturn(false)

SUT.refreshSignal.test {
SUT.updateAccount()

assertEquals(Unit, awaitItem())
assertEquals(true, SUT.isLoading) // This assertion fails as the isLoading is reset by this time

assertEquals(Unit, awaitItem())
assertEquals(false, SUT.isLoading)
expectNoEvents()
}
}


Дополнительная информация о попытках отладки.
  • Пыталась с помощью yield() и задержки().
yield() не сработало.
При использовании задержки(),
Если код продукта изменен таким образом,
р>
fun updateAccount() {
coroutineScope.launch {
startLoading()
delay(100) // Added delay here
val isAccountUpdated = updateAccountUseCase()
if (isAccountUpdated) {
navigator.navigateUp()
} else {
completeLoading()
// TODO: Show Error
}
}
}

И методы тестирования изменяются следующим образом:
@Test
fun `updateAccount when updateAccountUseCase returns true`() = testScope.runTest {
whenever(updateAccountUseCase()).thenReturn(true)

SUT.refreshSignal.test {
SUT.updateAccount()

assertEquals(Unit, awaitItem())
assertEquals(true, SUT.isLoading)
advanceUntilIdle() // Added this advance
expectNoEvents()
}

verify(navigator).navigateUp()
}

@Test
fun `updateAccount when updateAccountUseCase returns false`() = testScope.runTest {
whenever(updateAccountUseCase()).thenReturn(false)

SUT.refreshSignal.test {
SUT.updateAccount()

assertEquals(Unit, awaitItem())
assertEquals(true, SUT.isLoading)

advanceUntilIdle() // Added this advance
assertEquals(Unit, awaitItem())
assertEquals(false, SUT.isLoading)
expectNoEvents()
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... -and-reset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»