gpt4 book ai didi

android - ObservableField 值更改未传播

转载 作者:行者123 更新时间:2023-12-03 10:42:51 25 4
gpt4 key购买 nike

我是 mvvm 和 rxbinding 的新手。
我正在尝试使用 RxJava 和 DataBinding 将我的 ViewModel 与 android 上下文完全分离。

当我对 ViewModel 的某些代码(即表单验证)进行单元测试时,我的 ObservableFields 不会更改值并且该值保持为空。

我的 ViewModel 的最小示例:

class RegistrationViewModel(var validator: Validator) : ViewModel {

val username: ObservableField<String> = ObservableField()
val password: ObservableField<String> = ObservableField()

var signInButtonEnabled: ObservableField<Boolean>
var emailErrorVisibility: ObservableField<Boolean>

private fun validatePassword(password: String?) = password?.trim()!!.length >= 6

private fun validateUsername(username: String?) = validator.isValid(Validator.Field.EMAIL, username)

init {
val inputValid = Observable.combineLatest(
toObservable(username),
toObservable(password),
BiFunction<String, String, Boolean> { t1, t2 ->
validateUsername(t1) && validatePassword(t2)
}
)

signInButtonEnabled = toField(inputValid)
emailErrorVisibility = toField(toObservable(username).map { t -> !validateUsername(t) })
}
}

我希望只要 ObservableField 用户名的值发生更改,就会设置 ObservableField emailErrorVisibility

我的单元测试:
@Test
fun test_hideUsernameErrorMessage() {
val validator = mock(RegistrationValidator::class.java)

val viewModel = RegistrationViewModel(validator)

viewModel.username.set("")
assertThat(viewModel.emailErrorVisibility.get(), equalTo(false))

val invalidValue = "ABC"
Mockito.`when`(validator.isValid(Validator.Field.EMAIL, invalidValue)).thenReturn(false)
viewModel.username.set(invalidValue)
assertThat(viewModel.username.get(), equalTo(invalidValue))
assertThat(viewModel.emailErrorVisibility.get(), equalTo(true))
}

viewModel.username.set("") 行之后在这个测试中 viewMode.emailErrorVisibility 的值仍然不是。

值应该通过更改/设置用户名值来更新自己,我错了吗?

注意,函数 toField(Observble) 来自 https://github.com/manas-chaudhari/android-mvvm/blob/master/android-mvvm/src/main/java/com/manaschaudhari/android_mvvm/FieldUtils.java

最佳答案

数据绑定(bind)在设置绑定(bind)值时尝试高效。更改值时,它会发布以确保您在设置所有值之前完成更改。如果您仍在进行更改,则无需评估更改。

您可以使用 executePendingBindings() 强制评估此类情况下的边界值。 :

    viewModel.username.set("")
binding.executePendingBindings()
assertThat(viewModel.emailErrorVisibility.get(), equalTo(false))

关于android - ObservableField 值更改未传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138322/

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