Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何对RxSwift进行单元测试,该RxSwift在下一次输出之前进行去抖动?_Ios_Reactive Programming_Rx Swift_Debouncing_Debounce - Fatal编程技术网

Ios 如何对RxSwift进行单元测试,该RxSwift在下一次输出之前进行去抖动?

Ios 如何对RxSwift进行单元测试,该RxSwift在下一次输出之前进行去抖动?,ios,reactive-programming,rx-swift,debouncing,debounce,Ios,Reactive Programming,Rx Swift,Debouncing,Debounce,我正在使用RxSwift进行反应式编程,并想测试我的视图模型。 我有像这样的脱胶: 在视图模型中: let personNameMessage = input.personName.debounce(0.5).map { name -> String in return "Person Name = \(name)" } return Driver.just(personNameMessage) 然后在测试用例中: let scheduler = TestScheduler(in

我正在使用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)
,但结果相同

请帮忙


谢谢。

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

鉴于您使用的是
debounce
,而无需指定调度程序,我假设
personName
实际上是一个
驱动程序,在这种情况下,它将使用
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通常使用不同的调度器

解决方案:使用SharingScheduler.make()

导入RxCocoa
让personNameMessage=input.personName.debounce(0.5,调度程序:SharingScheduler.make()).map{name->String in
返回“人名=\(姓名)”
}
返回Driver.just(personNameMessage)
//测试用例
func testDebounce()抛出{
let schedular=TestScheduler(初始时钟:0,分辨率:0.001)
SharingScheduler.mock(调度程序:schedular){
让observer=schedular.createObserver(Double.self)
schedular.createColdObservable([.next(0,0)]).bind(to:observer)。disposed(by:bag)
schedular.start()
xctasertequal(oObserver.events,[.next(700100)])
}

}
Debounce有效,所以不要测试它。地图工作,所以不要测试它。在该代码块中,唯一需要测试的是传递给map的函数。(坦白地说,这个函数非常简单,我也不会费心去测试它。)谢谢你的回答,但上面的代码是我实际代码的简化版本。我不想检查去Bounce,但我想测试personNameMessage是否为
output
a值。如果您正在编写自己的使用调度程序的史诗,则需要使用
SharingScheduler.make()
而不是
MainScheduler.instance
。在非单元测试中,它将等同于调用
MainScheduler
,但现在它将是可模拟的。我从RayWenderlich那里学到了这一点:@ErikAllen你已经链接到我自己对我自己写的教程的评论:)现在我觉得有点傻了。但我仍然坚持我的评论;我必须做进一步的研究,让我的非司机工作,这个链接解释得很好。