Подождите, пока наблюдаемое достигнет завершенного состояния

У меня есть настройка, как показано ниже, и я хочу проверить состояние .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"...

0 ответов

Другие вопросы по тегам