2017-03-14 4 views
1

J'ai créé tableView avec des sections par RxDataSources.RxDataSources test

ViewController

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

sectionsObservable émet l'événement lorsqu'un nouvel élément est ajouté au tableau.

Je voudrais tester si un élément correct est sur indexPath approprié.

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

ViewModel

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

cela fonctionne dans l'application, mais les tests échouent. erreur fatale: Index hors plage

Tout est à cause de cela asynchrone. Comment tester ce cas?


EDIT 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 
     ... 
    } 
} 

Répondre

0

Si vous dites que le code de production fonctionne très bien, il doit y avoir une erreur stupide.

Dans le code de production, vous avez:

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

qui fixe interne éléments à l'intérieur du dataSource

Vérifiez si vous avez également à l'intérieur du code de test

+0

Je pense que dataSource.sectionModels n » t avoir assez de temps pour se mettre à jour et XCTAssert s'exécute plus rapidement async –

+0

Changez-vous un 'scheduler' quelque part? Sinon je pense que ce n'est pas un cas ici. Mais peut-être ... –

+0

Si c'est le cas je dirais que c'est un problème avec la conception de l'architecture. Des méthodes comme 'addElement'' getElement' sont des odeurs de code réactives (parce qu'elles ne sont pas réactives mais impératives) :( Cependant, vous n'avez pas encore répondu à ma question: D. Êtes-vous abonné à 'viewModel.dataSource' quelque part dans le code de test? –