2017-03-14 4 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) 
} 

のViewModel

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

それはアプリで動作しますが、テストが失敗しました。致命的なエラー:インデックスの範囲外

それはすべて非同期です。このケースをテストするには?


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

答えて

0

本番コードが正常に動作することを言うなら、それはいくつかの愚かな間違いである必要があります。生産コードで

あなたが持っている:あなたは、テストコードの中にそれを持っている場合、内部のdataSource

チェック内の項目を設定します

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

+0

私はdataSource.sectionModelsは」doesnのだと思いますアップデートするのに十分な時間があり、XCTAssertはより速く非同期で実行されます –

+0

'scheduler'をどこかに変更しますか?そうでない場合は、ここではそうではないと思います。 ... –

+0

もしそうなら、私は建築設計に問題があると言います。 'addElement'' getElement'のようなメソッドは反応性のあるコードのにおいです(反応的ではないので必須です):( あなたはまだ私の質問に答えていません:D。あなたの中の 'viewModel.dataSource'を購読しますか?テストコード? –

関連する問題