2017-08-31 15 views
0

MVVM環境のビューモデルに対してXcodeでコードカバレッジを生成する際に問題が発生しました。Swift MVVMのテスト戦略とコードカバレッジに関する質問

私たちの基本的な設定は、ビューコントローラがビューモデルに対してリクエストを行い、ビューモデルがウェブマネージャー上のメソッドを呼び出してWebサービスと通信することです。

実際のデータマネージャをサブクラス化し、VMによって呼び出された関数をオーバーライドする偽のデータマネージャを作成することによって、ビューモデルをテストするのが合理的にエレガントな方法だと思いました。

これが機能するには、VMがアプリターゲットとテストターゲットの一部である必要があります。これの明らかな副作用は、単体テストが合格しても、2つ以上のターゲットに属する項目のコードカバレッジが生成されないことです。コードカバレッジはプロジェクトで有効になっています。私は先に述べたように

import Foundation 

class BoosViewModel: BaseViewModel { 
    convenience override init() { 
     self.init(dataManager: BoosDataManager(), andModel: nil) 
    } 

    func getUnlinkedBoos(_ cardType: CardType) { 
     (dataManager as! BoosDataManager).getUnlinkedBoos(cardType) { result, error in 
      ...stuff happens here... 
     } 
    } 
} 

...とデータマネージャ

class BoosDataManager: DataManager { 

    static let SharedInstance: BoosDataManager = { 
     var manager = BoosDataManager() 
     return manager 
    }() 

    func getUnlinkedBoos(_ cardType: CardType = .loyalty, completion: @escaping ((_ result: BoosModel?, _ error: NSError?) -> Void)) { 
     ...stuff happens here... 
    } 
} 

...とテスト

class BoosViewModelTests: XCTestCase { 

    func testGetUnlinkedBoosHappyPath() { 
     class FauxDataManager: BoosDataManager { 
      override func getUnlinkedBoos(_ cardType: CardType = .loyalty, completion: @escaping ((_ result: BoosModel?, _ error: NSError?) -> Void)) { 
       ...stuff happens here... 
      } 
     } 

     let viewModel = BoosViewModel() 
     let dataManager = FauxDataManager() 

     viewModel.dataManager = dataManager 
     viewModel.getUnlinkedBoos(.loyalty) 
     XCTAssertTrue(testObserver.updated) 
     XCTAssertEqual(testObserver.newViewModel.getBoos().count, 1) 
    } 
} 

:ここ

は抜粋ビューモデルでありますこのシナリオのユニットテストは正常に完了しますが、ユニットカバレッジは生成されません。

私は実際にテストで使用された外部の偽データマネージャクラスを作成した古いテストを行っています。テスト対象のクラスはテスト対象には含まれておらず、

その欠点は、リターンの特定のケースを処理するために複数のデータマネージャを作成する必要があることです。クラスをカプセル化できない場合は、シナリオごとに1つずつ、迅速なデータマネージャを作成する必要があります。

私は内部クラスを思いつきました。

テスト対象のビューモデルをテスト対象から削除すると、問題が発生します。これを実行した後、テスト対象のビューモデルを解決できるように、@testable import BoosAppをユニットテストに追加します。私はこれを行うと、私は次のエラーを取得する:

は、タイプの値にキャストできませんでした - (0x11f673d18)ボース」から 'BoosTests.BoosViewModelTestsを(testGetUnlinkedBoosHappyPath()>())(FauxDataManager#1)。'。 BoosDataManager '(0x10444b128)。Aug 30 20:43:01 Pay:[BoosTests.BoosViewModelTests。(testGetUnlinkedBoosHappyPath() - >())。(FauxDataManager#1) '(0x11f673d18)の値を' Boos.BoosDataManager 'にキャストできませんでした。 0x10444b128)。

私は何が欠けているのか分かりません。このシナリオを動作させる方法があるのですか、テストコードの外に複数のデータマネージャを作成していますか?

答えて

0

結局のところ、主な問題は、ビューモデルとデータマネージャが何らかの形でテストターゲットに追加されていることでした。テストターゲットからそれらを削除した後、私はいくつかの小さな変更を加えることができ、すべて正常に動作しています。 FYI。

関連する問題