RxJava 2.验证TestObserver的调用顺序
RxJava 2. Verify TestObserver's invocation order
我的 API 中有两个可观察对象(视图模型可以显示主要思想,这只是示例):
interface ViewModel {
val height: Observable<Int>
val color: Observable<Int>
fun refresh()
}
如何在单元测试中验证 TestObserver
的调用顺序:
@Test
fun `When vm refresh, then color should be applied and then height`() {
val heightObserver = vm.height.test()
val colorObserver = vm.color.test()
vm.refresh()
// how to verify colorObserver value should be delivered first?
}
在通常情况下,我们不应该依赖顺序,但问题是:我们是否有办法验证顺序以及如何验证?
我建议使用 merge 运算符。
例如,这些 observables 实现为 ReplaySubject(不一定,可能还有其他):
class ViewModelImpl : ViewModel {
private val colorSubject = ReplaySubject.create<Int>()
private val heightSubject = ReplaySubject.create<Int>()
override val height: Observable<Int> = heightSubject
override val color: Observable<Int> = colorSubject
override fun refresh() {
colorSubject.onNext(1)
colorSubject.onNext(2)
colorSubject.onNext(3)
heightSubject.onNext(4)
heightSubject.onNext(5)
heightSubject.onNext(6)
}
}
对于这样的实现,这个测试会成功:
@Test
fun refresh() {
val vm: ViewModel = ViewModelImpl()
vm.refresh()
Observable.merge(vm.color, vm.height)
.test()
.assertValues(1, 2, 3, 4, 5, 6)
}
并且执行此测试时出现错误:
@Test
fun name() {
val vm: ViewModel = ViewModelImpl()
vm.refresh()
Observable.merge(vm.color, vm.height)
.test()
.assertValues(4, 5, 6, 1, 2, 3)
}
我的 API 中有两个可观察对象(视图模型可以显示主要思想,这只是示例):
interface ViewModel {
val height: Observable<Int>
val color: Observable<Int>
fun refresh()
}
如何在单元测试中验证 TestObserver
的调用顺序:
@Test
fun `When vm refresh, then color should be applied and then height`() {
val heightObserver = vm.height.test()
val colorObserver = vm.color.test()
vm.refresh()
// how to verify colorObserver value should be delivered first?
}
在通常情况下,我们不应该依赖顺序,但问题是:我们是否有办法验证顺序以及如何验证?
我建议使用 merge 运算符。 例如,这些 observables 实现为 ReplaySubject(不一定,可能还有其他):
class ViewModelImpl : ViewModel {
private val colorSubject = ReplaySubject.create<Int>()
private val heightSubject = ReplaySubject.create<Int>()
override val height: Observable<Int> = heightSubject
override val color: Observable<Int> = colorSubject
override fun refresh() {
colorSubject.onNext(1)
colorSubject.onNext(2)
colorSubject.onNext(3)
heightSubject.onNext(4)
heightSubject.onNext(5)
heightSubject.onNext(6)
}
}
对于这样的实现,这个测试会成功:
@Test
fun refresh() {
val vm: ViewModel = ViewModelImpl()
vm.refresh()
Observable.merge(vm.color, vm.height)
.test()
.assertValues(1, 2, 3, 4, 5, 6)
}
并且执行此测试时出现错误:
@Test
fun name() {
val vm: ViewModel = ViewModelImpl()
vm.refresh()
Observable.merge(vm.color, vm.height)
.test()
.assertValues(4, 5, 6, 1, 2, 3)
}