[英]Subclassing RxSwift/Reactive extension for stubbing
假設我有一個帶有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(:)
以使用一組stubbed Vegetable
調用處理程序。 當使用像field.harvest(:)
這樣的MockField
對象時,一切正常,我得到了茬蔬菜。
現在我想對存根調用field.rx.harvest
的Reactive擴展做同樣的field.rx.harvest
,但我不能覆蓋它來返回stubbed Vegetables! 如何覆蓋rx
命名空間中的函數?
可能最簡單的方法不是子類化,而是根據Field.harvest(handler:)
定義harvest() -> Observable<Vegetable>
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()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.