ios – 为存根子类化RxSwift / Reactive扩展

假设我有一个带有收集函数的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 Vegetables调用处理程序.当使用像field.harvest(:)这样的MockField对象时,一切正常,我得到了茬蔬菜.

现在我想对存根调用field.rx.harvest的Reactive扩展做同样的事情,但我不能覆盖它来返回stubbed Vegetables!如何覆盖rx命名空间中的函数?

最佳答案 可能最简单的方法不是子类化,而是定义harvest() – >可观察到的与LT;蔬菜及GT;就Field.harvest而言(处理程序:)

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()
        }
    }
}

这样做你不需要维护两个收获实现.

PS:传递给一次性的块应该取消动作,而不是发送完成的事件.如果没有设施取消收获(处理程序:),您只需返回Disposables.create().

点赞