我正在使用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()
,但结果相同。
请帮助。
谢谢。
答案 0 :(得分:3)
鉴于您在使用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.
}
答案 1 :(得分:1)
这里的问题不在去抖方法本身中 但是,如果您在测试去抖动方法时遇到问题,则必须更改测试计划程序的分辨率,以进一步了解scheduler resolution
但是这里真正的问题是因为去抖通常使用不同的调度程序来测试不同调度程序上的Observable作品
解决方案:使用SharingScheduler.make()
import RxCocoa
let personNameMessage = input.personName.debounce(0.5,scheduler: SharingScheduler.make()).map { name -> String in
return "Person Name = \(name)"
}
return Driver.just(personNameMessage)
//The test case
func testDebounce() throws {
let schedular = TestScheduler(initialClock: 0, resolution: 0.001)
SharingScheduler.mock(scheduler: schedular) {
let observer = schedular.createObserver(Double.self)
schedular.createColdObservable([.next(0, 0)]).bind(to: observer).disposed(by: bag)
schedular.start()
XCTAssertEqual(oObserver.events, [.next(700, 100)])
}
}
答案 2 :(得分:0)
当您真正考虑它时,您无需测试去抖动是否有效(当然,它确实有效,RxSwift有一些测试可以证明其有效),您需要测试的只是它是链的一部分。为此,您只需加载.swift
文件的文本并对其运行正则表达式。