3

我正在使用 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.advanceBy(550)之后,scheduler.start()但结果是一样的。

请帮忙。

谢谢你。

4

3 回答 3

5

鉴于您在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.
}
于 2018-09-08T12:18:50.943 回答
3

这里的问题不在于 debounce 方法本身,但是,如果您在测试 debounce 方法时遇到问题,您必须更改测试调度程序的分辨率以了解有关调度程序分辨率的更多信息

但这里真正的问题是测试 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)])
    }
}

于 2020-09-26T12:13:32.767 回答
0

当你真正考虑它时,你不需要测试去抖动是否有效(当然它有效,RxSwift 有几个测试证明它有效,)你需要测试的是它是链的一部分。为此,您可以简单地加载.swift文件的文本并在其上运行正则表达式。

于 2018-09-01T11:40:48.280 回答