2017-03-14 11 views
3

私はこのビューモデルを持っています。このモデルは、5つの他の信号をブール値に単純に組み合わせたものです。RxTestでcombineLatest observableをテストするにはどうすればよいですか?

import RxSwift 

class SchedulingFormViewModel: BaseViewModel { 

    let places = Variable<[String]>([]) 

    var formIsValid: Observable<Bool>! 

    override init() { 
     super.init() 
     places.value = ["LUGAR 1", "LUGAR 2", "LUGAR 3"] 

     formIsValid = Observable.combineLatest(UserSession.currenctScheduling.dateSignal.asObservable(), 
               UserSession.currenctScheduling.carSignal.asObservable(), 
               UserSession.currenctScheduling.locationSignal.asObservable(), 
               UserSession.currenctScheduling.servicesSignal.asObservable()) 
     { (date: Date?, car: Car?, location: String?, services: [Service]?) in 
      print("DATE: \(date), CAR: \(car), LOCATION: \(location), SERVICES:\(services)") 
      guard let servicesArray = services else { return false } 
      let valid = date != nil && car != nil && location != nil && servicesArray.count > 0 
      return valid 
     } 
    } 
} 

次に、シグナルが変化するかどうかをテストするだけの方法でテストクラスを作成します。私はいろいろなアプローチを試しましたが、最終的に真の価値を得られるものはありません。観測信号は、テストが実行された後にのみ真の信号を発する。

私のテストクラスは、私は私が私のformIsValidを結合のようなものを試してみたTestScheduler

func testFormValidation() { 
    UserSession.currenctScheduling.dateSignal.value = Date() 
    UserSession.currenctScheduling.carSignal.value = Car() 
    UserSession.currenctScheduling.servicesSignal.value = [Service(), Service()] 

    let location = scheduler.createHotObservable([ 
     next(100, "TEST") 
    ]) 

    location.subscribe(onNext: { (text) in 
     print("LOCATION: \(text)") 
     UserSession.currenctScheduling.locationSignal.value = text 
    }).addDisposableTo(disposeBag) 


    let results = scheduler.createObserver(Bool.self) 

    scheduler.scheduleAt(0) { 
     self.viewModel.formIsValid.subscribe(results).addDisposableTo(self.disposeBag) 
    } 

    let expected = [ 
     next(100, true) 
    ] 

    scheduler.start() 

    XCTAssertEqual(results.events, expected) 
} 
また

func testFormValidation() { 
    UserSession.currenctScheduling.dateSignal.value = Date() 
    UserSession.currenctScheduling.carSignal.value = Car() 
    UserSession.currenctScheduling.servicesSignal.value = [Service(), Service()] 

    let location = scheduler.createHotObservable([ 
     next(100, "TEST"), 
     next(150, "TEST 2"), 
     next(200, "TEST 3") 
     ]) 

    location.subscribe(onNext: { (text) in 
     print("LOCATION: \(text)") 
     UserSession.currenctScheduling.locationSignal.value = text 
    }).addDisposableTo(disposeBag) 


    var results = [Bool]() 
    viewModel.formIsValid.subscribe(onNext: { (value) in 
     results.append(value) 
    }).addDisposableTo(disposeBag) 

    let expected = [true, true, true] 

    scheduler.start() 

    XCTAssertEqual(results, expected) 
} 

を試してみたこの

import XCTest 

import RxSwift 
import RxTest 

@testable import Automobi 

class SchedulingUnitTests: XCTestCase { 

    var viewModel: SchedulingFormViewModel! 
    var disposeBag: DisposeBag! 
    var scheduler: TestScheduler! 

    override func setUp() { 
     super.setUp() 
     viewModel = SchedulingFormViewModel() 
     UserSession.clearScheduling() 
     disposeBag = DisposeBag() 
     scheduler = TestScheduler(initialClock: 0) 
    } 
} 

のような設定です変数を指定し、最後にその値を検証します。

func testFormValidation() { 
     UserSession.currenctScheduling.dateSignal.value = Date() 
     UserSession.currenctScheduling.carSignal.value = Car() 
     UserSession.currenctScheduling.locationSignal.value = "TESTE" 
     UserSession.currenctScheduling.servicesSignal.value = [Service(), Service()] 

     sleep(5) 

     XCTAssertTrue(viewModel.formIsValid.value) 
} 

しかし、私は期待した結果を得られません。すべてのテストが失敗し、コードが実行に戻ると、私は本当のシグナルを得ます。また、アプリケーションを実行すると、期待どおりにコードが実行されるだけでテストでそれをキャッチする必要があります。何か案は?!あなたの最初の試行で

答えて

0

、あなたはおそらくクロック0で値を取得しているので、あなたのexpected値は次のようになります。

let expected = [ 
    next(0, false) 
    next(100, true) 
] 
関連する問題