我正在尝试为我的本机移动应用程序编写一些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
,它有两个可能的完成块: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的承诺。
在科特林有一个人吗?如果没有,我该如何在Kotlin中实现Swift的testLogin
方法的版本?
答案 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
};