gpt4 book ai didi

android - 为 Espresso 测试制作 CoroutineDispatcher IdlingResource

转载 作者:行者123 更新时间:2023-12-04 15:44:13 25 4
gpt4 key购买 nike

我正在尝试找到一种方法来很好地实现一个 IdlingResource,它将轮询 CoroutineDispatcher 的 isActive 属性。但是,从调试来看,检查此属性时似乎从来没有 Activity 的作业。

到目前为止,我已经尝试使用 AsyncTask 的 THREAD_POOL_EXECUTOR 进行内置空闲,但在使用 asCoroutineDispatcher 扩展函数并使用结果时它似乎不起作用CoroutineDispatcher 启动我的 ViewModel 的工作。我尝试编写自定义 IdlingResource

View 模型

fun authenticate(username: String, password: String) = viewModelScope.launch(Dispatchers.Default) {
if (_authenticateRequest.value == true) {
return@launch
}

_authenticateRequest.postValue(true)
val res = loginRepo.authenticate(username, password)
_authenticateRequest.postValue(false)

when {
res is Result.Success -> {
_authenticateSuccess.postValue(res.item)
}
res is Result.Failure && res.statusCode.isHttpClientError -> {

_authenticateFailure.postValue(R.string.invalid_password)
}
else -> {
_authenticateFailure.postValue(R.string.network_error)
}
}
}

空闲资源

class CoroutineDispatcherIdlingResource(
private val resourceName: String,
private val dispatcher: CoroutineDispatcher
) : IdlingResource {
private var callback: IdlingResource.ResourceCallback? = null

override fun getName() = resourceName

override fun isIdleNow(): Boolean {
if (dispatcher.isActive) { return false }

callback?.onTransitionToIdle()
return true
}

override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.callback = callback
}
}

Espresso 测试

@RunWith(AndroidJUnit4::class)
class LoginIntegrationTest {
@get:Rule
val activityRule = ActivityTestRule(MainActivity::class.java)

var idlingResource: CoroutineDispatcherIdlingResource? = null

@Before
fun before() {
idlingResource = CoroutineDispatcherIdlingResource(this.javaClass.simpleName, Dispatchers.Default)
IdlingRegistry.getInstance().register(idlingResource)
}

@Test
fun loginFailure() {
onView(withId(R.id.username))
.perform(clearText()).perform(typeText("aslkdjqwe"))
onView(withId(R.id.password))
.perform(clearText()).perform(typeText("oxicjqwel"))
onView(withId(R.id.login_button))
.perform(click())

onView(withId(com.google.android.material.R.id.snackbar_text))
.check(matches(withText(R.string.invalid_password)))
}
}

我希望在调用 ViewModel 的“authenticate”函数后 isActive 属性为真,但事实似乎并非如此。它总是看起来是错误的,因为在 CoroutineDispatcher 中从来没有 Activity 的 Job。

最佳答案

想出一个解决办法!事实证明,AsyncTask 的 THREAD_POOL_EXECUTOR 实际上为此工作得很好。我缺少的是用于 Retrofit/OkHttp 的 IdlingResource。

我最初的假设是在 THREAD_POOL_EXECUTOR 上运行的协同程序会在 HTTP 客户端关闭时隐式等待,但我使用了 IdlingResource here很好地完成所有事情。

关于android - 为 Espresso 测试制作 CoroutineDispatcher IdlingResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56583557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com