¿Cómo probar una combinación más observable con RxTest?

Así que tengo este viewModel que tiene una validation observable que es simplemente la combinación de otras 5 señales en un boolean.

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

Y luego tengo mi class de testing con un método que debería probar si la señal cambia o no. He intentado una variedad de enfoques, pero ninguno de ellos realmente obtiene el verdadero valor al final. El observable solo emite una señal verdadera después de que se haya ejecutado la testing.

Mi class de testing está configurada como esta

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

He probado el 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) } 

también

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

He intentado vincular mi formIsValid a una variable y verificar su valor al final.

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

Pero nunca obtengo el resultado esperado. Obtuve una señal verdadera después de que todas las testings fallaron y el código vuelve a ejecutarse. Además, cuando ejecuto la aplicación, el código se ejecuta como esperaba, solo necesito capturarlo en la testing. ¡¿Algunas ideas?!

    En su primer bash, es probable que obtenga un valor en el reloj 0, por lo que su valor expected debería ser:

     let expected = [ next(0, false) next(100, true) ]