Вот один из способов проверки:
class RxSandboxTests: XCTestCase {
func testBinders() {
let scheduler = TestScheduler(initialClock: 0)
let source = scheduler.createColdObservable([.next(5, "hello"), .completed(10)])
let sink = scheduler.createObserver(Bool.self)
let disposeBag = DisposeBag()
let viewModel = SearchViewViewModel(appLocationManager: StubManager())
source.bind(to: viewModel.nearByCity).disposed(by: disposeBag)
viewModel.isNearBy.bind(to: sink).disposed(by: disposeBag)
scheduler.start()
XCTAssertEqual(sink.events, [.next(0, true), .next(5, false)])
}
}
Некоторые другие пункты:
Не заставляйте ваши предметные свойства var
использовать взамен let
, потому что вы не хотите, чтобы кто-либо мог заменить их несвязанными версиями.
Тот факт, что вы должны использовать AppLocationManager
в этом коде, который вам не нужен, подразумевает, что объект делает слишком много. Нет ничего плохого в наличии нескольких моделей представлений в контроллере представлений, каждая из которых обрабатывает разные части представления.
Лучше всего вообще избегать использования объектов (реле) в коде модели представления, при необходимости их лучше оставлять в императивной части кода.
Как минимум, разбейте функцию setupBinders, чтобы детали можно было проверить независимо. Выше можно было написать как простую, легко тестируемую бесплатную функцию:
func isNearBy(city: Observable<String?>) -> Observable<Bool> {
return city
.distinctUntilChanged()
.map {$0 ?? ""}
.map {$0 == ""}
}