Подождите, пока наблюдаемое достигнет завершенного состояния
У меня есть настройка, как показано ниже, и я хочу проверить состояние .empty.
// MARK: - States
enum State {
case loading(Bool)
case error(SerializedNetworkError?)
case empty
}
// MARK: - Properties
private(set) var pokemonCellModels = BehaviorRelay<[PokemonTableViewCellModel]>(value: [])
private(set) var viewState = BehaviorRelay<State>(value: .loading(true))
// MARK: - API Calls
func loadPokemons() {
viewState.accept(.loading(true))
services.getPokemonList().subscribe(onNext: { pokemonListResponse in
guard let results = pokemonListResponse?.results, results.count > 0 else {
self.viewState.accept(.empty)
return
}
let viewModelsForResult = results.map({ (listItem) -> PokemonTableViewCellModel in
return PokemonTableViewCellModel(listItem: listItem)
})
if viewModelsForResult.count == 0 {
self.viewState.accept(.empty)
}
self.pokemonCellModels.accept(viewModelsForResult)
}, onError: { (error) in
let networkError = error as! NetworkError
self.viewState.accept(.error(networkError.requestError))
}, onCompleted: {
self.viewState.accept(.loading(false))
}).disposed(by: disposeBag)
}
Мой метод services.getPokemonList возвращает наблюдаемую модель моего ответа. Чтобы перейти в состояние .empty, мой API должен вернуть пустой массив или нулевой результат. У меня должно быть 4 события на viewState [.loading (true),.loading (true),.loading (false),.empty] и два на pokemonCellModels [[], []] Но я не уверен, как сделать мой тестовый код получить все эти события. Я использую RxTests и пытаюсь использовать RxBlocking.
Тестовый код, который у меня есть, таков:
func testEmptyState() {
// Given
let actionsDelegateStub = HomeViewControllerActionsDelegateStub()
let mockURL = URL(string: "http://someurl.com")!
let mockedSession = MockURLSession(data: nil, response: nil, error: nil)
let mockedNetworkDispatcher = NetworkDispatcher(url: mockURL, session: mockedSession)
let mockedPokemonServices = PokemonService(dispatcher: mockedNetworkDispatcher)
// When
let sut = HomeViewModel(actionsDelegate: actionsDelegateStub, services: mockedPokemonServices)
let viewStateResults = testScheduler.createObserver(HomeViewModel.State.self)
testScheduler.scheduleAt(0) {
sut.viewState.subscribe(viewStateResults.asObserver()).disposed(by: self.disposeBag)
}
sut.loadPokemons()
testScheduler.start()
// Then
let viewStateExpectedResults: [HomeViewModel.State] = [.loading(true), .loading(true), .loading(false), .empty]
var colectedViewStates = [HomeViewModel.State]()
for event in viewStateResults.events {
guard let element = event.value.element else { return }
colectedViewStates.append(element)
}
XCTAssertEqual(viewStateExpectedResults, colectedViewStates)
}
Может кто-нибудь помочь мне увидеть, что я здесь делаю не так? Я новичок в тестировании RxSwift. Я думаю, что мне нужно подождать, пока services.getPokemonList достигнет "onCompleted State"...