Котлинский эквивалент Swift Ожидания / Обещания - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь написать несколько юнит-тестов для своих родных мобильных приложений, но столкнулся с препятствиями в моих тестах Android. В частности, я изо всех сил пытаюсь найти пример Котлинской версии «Ожидания / обещания Свифта».

Я нашел примеры Kotlin Promises, но они кажутся намного сложнее, чем нужно ...

Например, вот тест для функции входа в API в моем проекте iOS:

func testLogin() {

    /// Prepare for login
    if CURRENT_USER != nil {
        logout()
    }

    /// Login
    let promise = expectation(description: "User is logged in.")

    // 1. Given
    var isSuccess: Bool = false

    // 2. When
    User.login(username: maleUsername, password: malePassword, success: {
        isSuccess = true
        promise.fulfill()
    }) { (_, agreeToTerms) in
        XCTFail()
    }
    wait(for: [promise], timeout: maxTimeOut)

    // 3. Then
    XCTAssertNotNil(CURRENT_USER)
    XCTAssertTrue(isSuccess)

    /// Logout
    logout()
}

Это довольно просто для меня. У меня есть асинхронный метод login, который имеет два возможных блока завершения: success и failure; и мне нужно дождаться завершения одного из них, прежде чем оценивать. Для этого я создаю обещание перед вызовом, затем я выполняю обещание в двух блоках завершения, и я ожидаю ожидания выполнения до опровергаю мои утверждения.

Сейчас в Котлине у меня похожий тест:

private val loginFragment = LoginFragment()

@Test
fun loginTest() {

    val username = ""
    val password = ""

    // TODO: Create Promise

    loginFragment.loginViewModel
            .login(username, password)
            .observe(loginFragment, Observer {
                loginFragment.activity?.onResult(it?.result,

                        onSuccess = {
                            // TODO: Fill Promise
                        },
                        onValidationError = {
                            // TODO: Fail Test
                        })
            })

    // TODO: Assertions

}

Но я не могу найти эквивалент обещаний Свифта ..

Существует ли в Котлине? Если нет, то как мне реализовать версию моего метода Swift testLogin в Kotlin?

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете использовать сопрограммы Kotlin, например:

@Test
fun loginTest() {
    val result = runBlocking {
        val loginResult = login() 
        loginResult
    }
    if (result == "Success") {
        // do your work when Success
    } else {
        // do your work when Error
    }
}
suspend fun login(): String = suspendCoroutine { continuation ->
    val username = ""
    val password = ""
    loginFragment.loginViewModel
    .login(username, password)
    .observe(loginFragment, Observer {
        loginFragment.activity?.onResult(it?.result,

                    onSuccess = {
                        continuation.resume("Success")
                    },
                    onValidationError = {
                        continuation.resume("Error") // take a look for other methods, e.g. resumeWithException(exception)

                    })
    })   
}

Чтобы использовать сопрограммы, вам нужно добавить следующие строки в зависимости файла build.gradle приложения:

final KOTLIN_COROUTINES_VERSION = '1.0.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$KOTLIN_COROUTINES_VERSION"

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...