比方说,我在Kotlin中拥有这段特定的代码。我的问题是在订阅过程中如何进行测试?我已将按钮的可见性设置为“可见”,并将文本设置为“”。订阅完成后,我就可以看到GONE并测试“ DONE”。
fun getInfo() {
getInfoFromApi()
.doOnSubscribe {
buttonVisibility.set(View.VISIBLE)
buttonText.set(“”)
}
.onFinally {
buttonVisibility(View.GONE)
buttonText.set(“DONE”)
}
.subscribe {
// Some other random stuff
}
}
}
到目前为止,我的测试用例是这样的。
@Test
fun getInfo() {
viewModel.getInfo()
Assert.assertEquals(View.GONE, viewModel.buttonVisibility.get())
Assert.assertEquals(“DONE”, viewModel.buttonText.get())
}
当您查看最终状态应该是哪种时,显然是正确的,但是我该如何测试doOnSubscribe的中间阶段?
如果按钮文本从“”设置为“完成”,并且可见性从“可见”变为“消失”,是否可以断言?
答案 0 :(得分:1)
doOnSubscribe
和onFinally
只是View
/ ViewModel
的状态,因此您可以提取这些状态并检查状态更改:
fun getInfo() {
getInfoFromApi()
.doOnSubscribe {
view.setButtonVisible()
}
.onFinally {
view.setButtonGone()
}
.subscribe {
// Some other random stuff
}
}
}
然后验证呼叫:
@Test
fun getInfo() {
val view = mock(View::class)
viewModel.getInfo()
verify(view, times(1)).setButtonVisible())
verify(view, times(1)).setButtonGone())
}
顺便说一句,如果您的示例应该与MVVM
一起使用,则您的ViewModel
不应引用View
。 ViewModel
应该提供视图绑定。然后代码可能像这样:
fun getInfo():Observable<State> {
return concat(
just(State.Progress),
getInfoFromApi().map(State.Result)
).onErrorResumeNext(just(State.Error))
}
然后测试变得更加抽象和清晰
@Test
fun getInfoSuccess() {
//config api success behaviour
TestObserver<State> observer = TestObserver.create();
viewModel.getInfo().subscribe(observer)
observer.assertResult(State.Progress, State.Result);
}
@Test
fun getInfoError() {
//config api error behaviour
TestObserver<State> observer = TestObserver.create();
viewModel.getInfo().subscribe(observer)
observer.assertResult(State.Progress, State.Error);
}