swift - Kotlin 等价于 Swift 期望/承诺
问题描述
我正在尝试为我的原生移动应用程序编写一些 UnitTest,但在我的 Android 测试中遇到了障碍。具体来说,我正在努力寻找 Kotlin 版本的 Swift 期望/承诺的示例。
我找到了 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
,它有两个可能的完成块:success
和failure
;在评估之前,我需要等待其中一个完成。为此,我在调用之前创建了一个Promise,然后在两个完成块中实现Promise,并在运行我的断言之前等待Promise 完成。
现在在 Kotlin 中,我有一个类似的测试:
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 中是否存在一个?testLogin
如果没有,我将如何在 Kotlin中实现我的 Swift 方法的一个版本?
解决方案
您可以使用 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"
希望它会有所帮助。
推荐阅读
- vector - (CAPL)我如何使用参数分配数组长度
- html-table - 具有固定标题和列的 Blazor 表组件
- xamarin - 在视图之间导航 Xamarin Forms
- css - online tool for css to scss convertor
- javascript - javascript .eval() 给了我未定义的
- reactjs - 有没有办法使用带有formik的状态来设置初始值?
- spring-boot - spring.jpa.properties.hibernate 和 spring.jpa.hibernate 之间的区别
- c# - Visual Studio 中 Android API 使用的代码规则
- java - 将 S3 存储桶中给定文件的所有版本从一个文件夹移动到另一个文件夹
- redux - 如何在 Redux 开发工具(扩展)中查看我的状态?