假设我有一个带有 harvest
函数的 Field
类:
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()
}
}
}
出于测试目的,我创建了一个名为 MockField
的 Field
子类,它覆盖了 harvest(:)
以使用一组 stub Vegetable
。当使用像 field.harvest(:)
这样的 MockField
对象时,一切正常,我得到了蔬菜残渣。
现在我想对 Reactive 扩展执行同样的操作,以对 field.rx.harvest
进行 stub 调用,但我无法覆盖它以返回 stub 的 Vegetables! 如何覆盖 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:传递给一次性的 block 应该取消操作,而不是发送完成的事件。如果没有设施可以取消harvest(handler:)
, 你可以简单地返回 Disposables.create()
.
关于ios - 为 stub 创建 RxSwift/Reactive 扩展的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41099777/