Как написать модульные тесты для асинхронной функции с аргументом обратного вызова - PullRequest
0 голосов
/ 27 июня 2019

Я пишу общие тесты для моей многоплатформенной библиотеки 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) }
            )
        }
    }    
}
...