2017-03-15 8 views
1

私のビューをテストするときに、私はこの問題に出くわした:私のViewModelでRxSwiftとXCTestでSwiftのメインスレッドに入る関数をテストするには?

私は、非同期操作に呼び出し、応答が到着したとき、私は私のビューの変化を生成するためにPublishSubjectを使用しています。私の見解では、ボタンを隠すか、または表示するためにDispatchQueue.main.asyncに電話します。

のViewModel

let refreshButtons = PublishSubject<Bool>(true) 
refreshButtons.onNext(true) 

ビュー

model.refreshButtons.asObservable() 
       .subscribe(onNext: { 
        [unowned self] success in 
        self.updateButtons(success) 
       }) 
       .addDisposableTo(disposable) 

private func updateButtons(_ show:Bool) { 
    DispatchQueue.main.async{ 
     button.isHidden = !show 
    } 
} 

今、私はどのようにユニットrefreshButtons.onNext(true)は非表示にしたり、私のボタンが表示されますことをテストをするのか分かりません。

  • メソッドをオーバーライドし、非同期期待を持つが、そのために私は、メソッドの国民は、私が何を望んでいないようにする必要があり、または
  • 派遣:私は考えることができる

    ソリューションがあります私のViewModelのメインキューではなく、ビューではなく、それは私にとって奇妙に聞こえるものですが、大丈夫かもしれません。

どうすればこの問題を解決できますか? ありがとうございます。

答えて

2

あなたはボタンがもはや隠されていないかどうかを確認待つためにあなたのユニットテストで述語に基づいて非同期期待を使用することができます。

func testButtonIsHidden() { 
    // Setup your objects 
    let view = ... 
    let viewModel = ... 

    // Define an NSPredicate to test your expectation 
    let predicate = NSPredicate(block: { input, _ in 
    guard let _view = input as? MyView else { return false } 
    return _view.button.isHidden == true 
    }) 


    // Create an expectation that will periodically evaluate the predicate 
    // to decided whether it's fulfilled or not 
    _ = expectation(for: predicate, evaluatedWith: view, handler: .none) 

    // Call the method that should generate the behaviour you are expecting. 
    viewModel.methodThatShouldResultInButtonBeingHidden() 

    // Wait for the 
    waitForExpectationsWithTimeout(1) { error in 
    if let error = error { 
     XCTFail("waitForExpectationsWithTimeout errored: \(error)") 
    } 
    } 
} 

注目に値する何かがあなたがNSPredicateに渡す値はclassでなければならないことです。これは、クラスが参照渡しされているため、述語ブロック内の値はビューモデルが触れたものと同じになるためです。コピーによって渡されたstructまたはenumを渡すと、プレディケートブロックは設定コードの実行時と同じ値のコピーを受け取り、常に失敗します。

代わりに@Randall Wangが提案したようにUIテストを使用したい場合は、この投稿は役に立ちます: "How to test UI changes in Xcode 7" 完全な開示、私はその投稿を書いた。

+0

このソリューションは完全に機能します。 ご協力いただきありがとうございます。 – Jefe55

+0

私の喜び@ Jefe55、喜んで役立つ:) – mokagio

0

まず、あなたがテストのプライベートメソッド

必要はありませんあなたはボタンが隠されているかいないかどうかをテストしたい場合は、ここでのUIテスト

を試しUIテストのWWDCです。

https://developer.apple.com/videos/play/wwdc2015/406/

+0

私の質問は正しく策定されていないと思います。私の意図は、メソッド自体をテストするのではなく、何らかの形でアクションの結果をテストすることです。 確かにUIテストは良い選択です。 ありがとうございました! – Jefe55

関連する問題