假设我有一个带有 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()
        }
    }
}

出于测试目的,我创建了一个名为 FieldMockField 子类,它覆盖 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/

10-10 16:44