Я пишу общие тесты для моей многоплатформенной библиотеки kotlin, которая реализует бизнес-логику API с использованием клиентской библиотеки ktor.
У меня есть функция, которая принимает обратный вызов в качестве аргумента, использует сопрограммы для выполнения запроса к API, а затем выполняет обратный вызов.
Вот упрощенная версия функции из моего класса UserApi, которую я хочу протестировать
fun <T : Any> fetch(
requestBuilder: HttpRequestBuilder,
deserializer: DeserializationStrategy<T>,
callback: (Either<ErrorMessage, T>) -> Unit)
{
GlobalScope.launch(dispatcherIO) {
val result: Either<ErrorMessage, T> =
try {
val returnObject: T = Json.parse(
deserializer,
HttpClient().post(requestBuilder)
)
Either.Right(returnObject)
} catch (e: Exception) {
Either.Left(ErrorMessage(e.message))
}
withContext(dispatcherMain) { callback(result) }
}
}
Я бы хотел написать модульный тест следующим образом:
@Test
fun requestOK() {
runTest { //runTest returns a platform specific runBlocking
val UserApi().fetch(request, User.serializer()) {
it.fold(
{ failure -> fail("must return success" },
{ user -> assertEquals(expectedUser, user) }
)
}
}
}