[英]How to unit test RxSwift which has debounce before output the next?
我正在使用 RxSwift 進行響應式編程,並想測試我的視圖模型。 我有這樣的去抖動:
在視圖模型中:
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.start()
之后添加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 方法本身,但是,如果您在測試 debounce 方法時遇到問題,則必須更改測試調度程序的分辨率以了解有關調度程序分辨率的更多信息
但這里真正的問題是在不同的調度程序上測試 Observable 的工作,因為 debounce 通常使用不同的調度程序
解決方案:使用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)]) } }
當你真正考慮它時,你不需要測試去抖動是否有效(當然它有效,RxSwift 有幾個測試證明它有效),你需要測試的是它是鏈的一部分。 為此,您可以簡單地加載.swift
文件的文本並在其上運行正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.