Kotlin相当于Swift期望/承诺

时间:2018-11-13 23:34:31

标签: swift unit-testing kotlin promise

我正在尝试为我的本机移动应用程序编写一些UnitTest,但是在我的Android测试中遇到了障碍。具体来说,我正在努力寻找Kotlin版本的Swift的Expectations / Promises的示例。

我已经找到了Kotlin Promises的示例,但是它们似乎比所需的要复杂得多...

例如,这是我的iOS项目中登录API功能的测试:

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,它有两个可能的完成块:successfailure;我需要等待其中一个完成才能进行评估。为此,我在通话前创建了一个承诺,然后在两个完成区块中兑现承诺,然后等待在执行我的断言之前完成。

现在在科特林,我有一个类似的测试:

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的承诺。

在科特林有一个人吗?如果没有,我该如何在Kotlin中实现Swift的testLogin方法的版本?

2 个答案:

答案 0 :(得分:1)

您可以使用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"

希望这会有所帮助。

答案 1 :(得分:1)

我发现this Kotlin Promise lib更接近Swift Promises。 使用该库,您的测试就可以了。

import React, { useState, useEffect } from 'react';
import { AppState } from 'react-native';

const App = () => {
  const [updateVal, setUpdateVal] = useState(false);
  const forceUpdate = newState => {
    if (newState === 'active')
      setUpdateVal(!updateVal); // forces a rerender
  }
  useEffect(() => {
    AppState.addEventListener('change', forceUpdate);
    return () => AppState.removeEventListener('change', forceUpdate);
  }, []);
  // return your contents
};