Скажем, у меня есть Field
класс с harvest
функции, как это:подклассов RxSwift/Реактивная расширение для гася
class Field {
func harvest(handler: (Vegetable) -> Void) {
…
handler(carrot)
…
handler(potato)
…
handler(carrot)
…
}
}
У меня также есть Реактивная версия/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
с именем MockField
, который переопределяет harvest(:)
, чтобы вызвать обработчик с набором заштрихованных Vegetable
с. При использовании объекта MockField
, такого как field.harvest(:)
, все работает отлично, и я получаю оштукатуренные овощи.
Теперь я хочу сделать то же самое с Reactive extension, чтобы звонить на field.rx.harvest
, но я не могу переопределить его, чтобы вернуть окутанные овощи! Как я могу переопределить функции в пространстве имен rx
?
Спасибо за комментарий! Именно так я это делаю, ссылаясь на базовую реализацию, но я не писал ее так, как в примере (моя ошибка, я ее обновлю). Однако проблема все еще существует. Как вы переопределите реализацию 'rx.harvest()' во время тестирования, чтобы вернуть stubbed 'Vegetable'? Я думаю, что это невозможно переопределить, поскольку это Reactive extension. Одно из решений заключалось бы в расширении 'Field' с помощью' rx_harvest' (а не 'rx.harvest'), поэтому я могу переопределить его для тестирования, но затем я потеряю группу Reactive. Есть предположения? –
С приведенной выше реализацией вы должны уже иметь значения 'MockVegetable' в наблюдаемых, если они используются как' MockField(). Rx.harvest() ', правильно? Кроме того, что происходит при выполнении расширений Reactive где base: MockField {func harvest() -> Observable {/ * ... * /}} '? –
tomahh
Я делаю 'extension Reactive где base: MockField {func harvest() -> Observable {return Observable.from ([Vegetable, ...])}}', чтобы вернуть окутанный 'Vegetable', и я добавляю' MockField' для класса, который его использует. Однако, поскольку 'MockField' не переопределяет' rx.harvest' поля ',' mock-реализация никогда не вызывается. –