Сопрограммы не продвигаются при тестировании Ktor с помощью Jetpack ComposeAndroid

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

Сообщение Anonymous »

Я пытаюсь протестировать свой код, использующий Ktor:
WeatherRepository:
class WeatherRepository(
engine: HttpClientEngine,
private val locationClient: LocationClient
) {
...

suspend fun getCurrentWeather(): CurrentWeather {
val coordinates = locationClient.getCoordinates()
val requestUrl = "forecast?current_weather=true&latitude=${coordinates.lat}&longitude=${coordinates.lon}"
val response = httpClient.get(requestUrl)
println(response)
....
}

HomeRepository:
class HomeRepository(
private val weatherRepository: WeatherRepository
) {
suspend fun getCurrentWeather(): CurrentWeather {
return weatherRepository.getCurrentWeather()
}
}

HomeViewModel:
class HomeViewModel(
private val homeRepository: HomeRepository
): ViewModel() {
...
private fun getCurrentWeather(refresh: Boolean) {
viewModelScope.launch {
try {
val weather = homeRepository.getCurrentWeather()
_uiState.update { it.copy(currentWeather = weather) }
} catch (e: Exception) {
...
}
}
}

MainDispatcherRule:
@OptIn(ExperimentalCoroutinesApi::class)
class MainDispatcherRule(
val testDispatcher: TestDispatcher = StandardTestDispatcher()
) : TestWatcher() {
override fun starting(description: Description) {
Dispatchers.setMain(testDispatcher)
}

override fun finished(description: Description) {
Dispatchers.resetMain()
}
}

Затем я использую это правило в тесте (модель представления инициализируется внутри homeBaseRule):
@get: Rule(order = 0)
val dispatcherRule = MainDispatcherRule()
@get: Rule(order = 1)
val homeBaseRule = HomeBaseRule()

Затем я выполняю заранееUntilIdle() после вызова getCurrentWeather модели представления, но код после val response = httpClient.get(requestUrl) выполняется только в том случае, если я вызываю заранееUntilIdle() много раз
@Test
fun fetchCurrentWeather_success() = runTest(dispatcherRule.testDispatcher) {
homeBaseRule.viewModel.handleIntent(HomeIntent.GetCurrentWeather)
advanceUntilIdle()

РЕДАКТИРОВАНИЕ
Я потратил еще немного времени на тестирование приложения и обнаружил, что вызов метода репозитория непосредственно из теста не не упоминаю вышеуказанную проблему:
@Test
fun test() = runTest {
homeBaseRule.setupHomeRepository(suggestionsGenerationException = homeBaseRule.exception)
val weather = homeBaseRule.homeRepository.getCurrentWeather()
assertTrue(weather != null)
}


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

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

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

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

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

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