为存根

时间:2016-12-12 11:25:00

标签: ios swift testing stub rx-swift

假设我有一个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的{​​{1}}子类,它覆盖MockField以使用一组存根harvest(:)来调用处理程序。当使用像Vegetable这样的MockField对象时,一切正常,我会得到茬蔬菜。

现在我想对Reactive扩展来对field.harvest(:)的存根调用做同样的事情,但是我无法覆盖它以返回存根的蔬菜! 如何覆盖field.rx.harvest命名空间中的函数?

1 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法可能不是子类化,而是根据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()