您正在使用MainScheduler限制查询。实例调度器。试着移除它,看看会发生什么。这可能就是为什么你只得到一个。测试时,需要将测试调度器注入到该节流阀中。
有几种不同的方法可以将正确的调度器引入到您的模型中。根据您当前的代码,依赖项注入可以很好地工作。
struct SearchViewModelImpl: SearchViewModel {
let query = PublishSubject<String>()
let results: Observable<BookResult<[Book]>>
init(searchService: SearchService, scheduler: SchedulerType = MainScheduler.instance) {
results = query
.distinctUntilChanged()
.throttle(0.5, scheduler: scheduler)
.filter({ !$0.isEmpty })
.flatMapLatest({ searchService.search(query: $0) })
}
}
然后在测试中:
let sut = SearchViewModelImpl(searchService: SearchServiceStub(erroring: true), scheduler: testScheduler)
还有,而不是使用
toBocking()
,可以将结果事件绑定到
testable Observer
。
func test_when_searchBooksErrored_then_nextEventWithError() {
let sut = SearchViewModelImpl(searchService: SearchServiceStub(erroring: true), scheduler: testScheduler)
let observer = scheduler.createObserver(BookResult<[Book]>.self)
scheduler
.createHotObservable([
Recorded.next(200, ("Rx")),
Recorded.next(800, ("RxSwift"))
])
.bind(to: sut.query)
.disposed(by: disposeBag)
sut.results.bind(to: observer)
.disposed(by: disposeBag)
scheduler.start()
XCTAssertEqual(observer.events.count, 2)
}
虽然
toBlocking()
在某些情况下可能很有用,当您将事件绑定到
testableObserver
。