我正在使用RxSwift进行反应式编程,并希望测试我的View模型。我有这样的辩论:
在视图模型中:
let personNameMessage = input.personName.debounce(0.5).map { name -> String in
return "Person Name = \(name)"
}
return Driver.just(personNameMessage)
然后在测试用例中:
let scheduler = TestScheduler(initialClock: 0)
let personNameInput = scheduler.createHotObservable([next(100, "John Doe")])
let personObserver = scheduler.createObserver(String.self)
output.personNameWelcome
.asObservable()
.subscribe(personObserver)
.disposed(disposeBag)
scheduler.start()
print(observer.events)
但它没有散发事件。我尝试在scheduler.advanceBy(550)
之后添加scheduler.start()
,但结果是一样的。
请帮忙。
谢谢。
鉴于您在没有指定调度程序的情况下使用debounce
,我假设personName
实际上是Driver
- 在这种情况下,它将使用DriverSharingStrategy.scheduler
作为其默认调度程序。
默认情况下,这会导致MainScheduler.instance
,但在测试场景中,您可以简单地使用SharingScheduler
类进行模拟。
SharingScheduler.mock(scheduler: yourTestScheduler) {
/// make all your assertions here.
/// the `mock()` will make `DriverSharingStrategy.scheduler` return
/// your test scheduler, instead of the default one.
}
当你真正考虑它时,你不需要测试debounce是否有效(当然它有效,RxSwift有几个测试证明它有效),你需要测试的是它是链的一部分。为此,您只需加载.swift
文件的文本并在其上运行正则表达式。