所以我有这个viewmodel,它有一个验证observable,它只是将5个其他信号组合成一个布尔值.
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 } } }
然后我让我的测试类有一个方法,只测试信号是否改变.我尝试了各种方法,但最终都没有真正获得真正的价值.在测试运行后,observable只发出一个真实的信号.
我的测试类是这样设置的
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) } }
我试过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(),"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) }
我尝试过将formIsValid绑定到Variable并在最后验证其值.
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上获得一个值,因此您的预期值应为:
let expected = [ next(0,false) next(100,true) ]