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() и задержки().
При использовании задержки(),
Если код продукта изменен таким образом,
р>
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
Мобильная версия