【问题标题】:Subclassing RxSwift/Reactive extension for stubbing为存根子类化 RxSwift/Reactive 扩展
【发布时间】:2016-12-12 11:25:00
【问题描述】:

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

出于测试目的,我创建了一个名为MockFieldField 子类,它覆盖harvest(:) 以使用一组存根Vegetables 调用处理程序。当使用像field.harvest(:) 这样的MockField 对象时,一切正常,我得到了蔬菜残茬。

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

【问题讨论】:

    标签: ios swift testing stub rx-swift


    【解决方案1】:

    可能最简单的方法不是子类化,而是根据Field.harvest(handler:) 定义harvest() -&gt; Observable&lt;Vegetable&gt;

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

    【讨论】:

    • 感谢您的评论!我就是这样做的,调用基本实现,但我在示例中没有这样写(我的错,我会更新它)。但是,问题仍然存在。在测试返回存根的Vegetables 时如何覆盖rx.harvest() 的实现?我认为不可能覆盖它,因为它是一个响应式扩展。一种解决方案是将Field 扩展为rx_harvest(而不是rx.harvest),这样我就可以覆盖它进行测试,但随后我会松动反应性分组。有什么想法吗?
    • 通过上述实现,如果像MockField().rx.harvest() 一样使用,您应该已经将MockVegetable 作为可观察对象中的值,对吧?另外,extension Reactive where base: MockField { func harvest() -&gt; Observable&lt;Vegetable&gt; { /* ... */ } } 时会发生什么?
    • 我正在做extension Reactive where base: MockField { func harvest() -&gt; Observable&lt;Vegetable&gt; { return Observable.from([ Vegetable, … ]) } } 以返回存根的Vegetables,并将MockField 注入使用它的类。但是,由于MockField 没有覆盖Fieldrx.harvest,因此永远不会调用模拟实现。
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2018-12-30
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多