2017-03-14 1 views
1

RxDataSources로 섹션이있는 tableView를 만들었습니다.RxDataSources 테스트

의 ViewController

viewModel.sectionsObservable 
     .bindTo(tableView.rx.items(dataSource: viewModel.dataSource)) 
     .disposed(by: disposeBag) 

sectionsObservable 새로운 소자 어레이에 추가 이벤트를 방출한다.

올바른 요소가 적절한 indexPath에 있는지 테스트하고 싶습니다.

func testGettingElementForIndexPath() { 
    let element = Element() 
    viewModel.addElement(element) 
    let fetchedElement = viewModel.getElement(at: IndexPath(row: 0, section: 0)) 
    XCTAssertEqual(element, fetchedElement) 
} 

뷰 모델

func getElement(at indexPath: IndexPath) -> Element { 
    return self.dataSource.sectionModels[indexPath.section].items[indexPath.row] 
} 

는 응용 프로그램에서 작동하지만 테스트가 실패합니다. 치명적인 오류 : 인덱스가 범위를 벗어났습니다.

모두 비동기입니다. 이 사건을 어떻게 테스트 할 수 있습니까?


편집 1 : 의 ViewModel 프로덕션 코드가 일부 어리석은 실수하는 잘 작동 말할 경우

let elementsVariable = Variable<[TaskData]>([]) 
func addElement(_ element: Element) { 
    elementsVariable.value.append(element) 
} 

var sectionsObservable: Observable<[Day]> { 
    return elementsVariable.asObservable().map { (elements) -> [MySection] in 
     ... 
    } 
} 

답변

0

. 생산 코드에서

당신은 : 당신은 또한 테스트 코드 내부를 경우 내부적으로는 dataSource

확인 내에서 항목을 설정

.bindTo(tableView.rx.items(dataSource: viewModel.dataSource))

+0

나는 dataSource.sectionModels은 '아무튼 생각 업데이트 될 시간이 충분하고 XCTAssert가 더 빠른 비동기로 실행됩니다. –

+0

'scheduler'를 어딘가에 변경합니까? 그렇지 않다면 여기에 해당하지 않는다고 생각합니다. 하지만 ... –

+0

그렇다면 건축 디자인에 문제가 있다고 생각합니다. 'addElement''getElement'와 같은 메소드는 반응 코드이지만 냄새가납니다. (반응이 없지만 필수적이기 때문에) ( 그러나 아직 내 질문에 답하지 못했습니다 : D. 'viewModel.dataSource'를 구독하고 있습니까? 테스트 코드는 무엇입니까? –