Сопрограммы не продвигаются при тестировании 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,
scopeProvider: CoroutineScopeProvider
): ViewModel() {
...
private val scope = scopeProvider(viewModelScope)
private fun getCurrentWeather(refresh: Boolean) {
scope.launch {
try {
val weather = homeRepository.getCurrentWeather()
_uiState.update { it.copy(currentWeather = weather) }
} catch (e: Exception) {
...
}
}
}
CoroutineScopeProvider:

Код: Выделить всё

class CoroutineScopeProvider(private val scope: CoroutineScope? = null,
private val dispatcher: CoroutineDispatcher) {
operator fun invoke(inputScope: CoroutineScope): CoroutineScope =
CoroutineScope((scope ?: inputScope).coroutineContext + dispatcher + SupervisorJob())
}
Затем я вставляю этого поставщика области в модель представления в своем тесте:

Код: Выделить всё

val dispatcher = StandardTestDispatcher()
val testScope = TestScope(dispatcher)
val coroutineScopeProvider = CoroutineScopeProvider(testScope, dispatcher = dispatcher)
viewModel = HomeViewModel(
scopeProvider = coroutineScopeProvider, ...)
Затем я выполняю заранееUntilIdle() после вызова getCurrentWeather модели представления, но код после val response = httpClient.get(requestUrl) выполняется только в том случае, если я вызываю заранееUntilIdle() много раз

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

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

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

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

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

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