ios - 为 stub 创建 RxSwift/Reactive 扩展的子类

标签 ios swift testing stub rx-swift

假设我有一个带有 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(:) 以使用一组 stub Vegetable。当使用像 field.harvest(:) 这样的 MockField 对象时,一切正常,我得到了蔬菜残渣。

现在我想对 Reactive 扩展执行同样的操作,以对 field.rx.harvest 进行 stub 调用,但我无法覆盖它以返回 stub 的 Vegetables! 如何覆盖 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:传递给一次性的 block 应该取消操作,而不是发送完成的事件。如果没有设施可以取消harvest(handler:) , 你可以简单地返回 Disposables.create() .

关于ios - 为 stub 创建 RxSwift/Reactive 扩展的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41099777/

相关文章:

ios - 将 UIView 单元格组件的背景颜色更改为绿色不会将组件呈现为绿色,

swift - 从外部引用设置 .attributedText 属性(可通过 NIB 加载的 UIView 内的 socket 访问)似乎失败

haskell - tasty-discover with stack run 0 测试

google-chrome - 在较旧的 google chrome 版本中进行测试

angularjs - Jasmine spyOn 没有考虑有 Angular 的垃圾

ios - 仅锁定主 UIViewController 的方向 - iOS

ios - 在 Objective-C 中调用 setter

ios - Swift - 具有实现通用协议(protocol)的值的 Typealias 字典

ios - 为什么我的 UITableViewCells 在我点击它们时会变成灰色?

swift - 无法识别的选择器发送到实例