假设我有一个带有 Field
函数的 harvest
类,如下所示:
class Field {
func harvest(handler: (Vegetable) -> Void) {
…
handler(carrot)
…
handler(potato)
…
handler(carrot)
…
}
}
我也有相同功能的响应式(Reactive)版本/API:
import RxSwift
extension Reactive where Base: Field {
func harvest() -> Observable<Vegetable> {
return Observable.create { observer in
self.base.harvest(handler: observer.onNext)
return Disposables.create()
}
}
}
出于测试目的,我创建了一个名为
Field
的 MockField
子类,它覆盖 harvest(:)
以使用一组 stub Vegetable
调用处理程序。当使用像 MockField
这样的 field.harvest(:)
对象时,一切正常,我得到了 stub 蔬菜。现在我想对 Reactive 扩展做同样的事情来 stub 调用
field.rx.harvest
,但我不能覆盖它来返回 stub 蔬菜! 如何覆盖 rx
命名空间中的函数? 最佳答案
可能最简单的方法不是子类化,而是根据 harvest() -> Observable<Vegetable>
定义 Field.harvest(handler:)
import RxSwift
extension Reactive where Base: Field {
func harvest() -> Observable<Vegetable> {
return Observable.create { observer in
self.base.harvest(handler: observer.onNext)
return Disposables.create()
}
}
}
这样做,您将不需要维护
harvest
的两个实现。PS:传递给一次性的块应该取消操作,而不是发送完成的事件。如果没有取消
harvest(handler:)
的功能,您可以简单地返回 Disposables.create()
。关于ios - 子类化 RxSwift/Reactive 扩展以进行 stub ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41099777/