- 에러가 맞는지 확인하는 경우의 테스트는 에러가 일치하는지를 테스트하지 말고 do, try, catch 를 사용한다
func testError() {
var erroredCorrectly = false
let observable = URLSession.shared.rx.json(request: self.errorRequest)
do {
let _ = try observable.toBlocking().first()
assertionFailure()
} catch (RxURLSessionError.unknown) {
erroredCorrectly = true
} catch {
assertionFailure()
}
expect(erroredCorrectly) == true
}
var scheduler: TestScheduler!
var subscription: Disposable!
override func setUp() {
super.setUp()
scheduler = TestScheduler(initialClock: 0)
}
override func tearDown() {
scheduler.scheduleAt(1000) {
self.subscription.dispose()
}
super.tearDown()
}
func testAmb() {
let observer = scheduler.createObserver(String.self)
let observableA = scheduler.createHotObservable([
next(100, "a"),
next(200, "b"),
next(300, "c")
])
let observableB = scheduler.createHotObservable([
next(90, "1"),
next(200, "2"),
next(300, "3")
])
let ambObservable = observableA.amb(observableB)
scheduler.scheduleAt(0) {
self.subscription = ambObservable.subscribe(observer)
}
scheduler.start()
let results = observer.events.map {
$0.value.element!
}
XCTAssertEqual(results, ["1", "2", "3"])
}
- toBlocking() : 시퀀스가 종료될때까지 현재 스레드를 잠근다
- 시퀀스가 종료되기 이전에 제한시간에 도달하면 에러 발생
- 비동기 작업을 동기적으로 변환하기 위한 도구
- materialize() : 비동기작업 결과를 Single 처럼 명확한 의도인 성공이냐 실패냐의 경우의 수에 따라 디테일하게 테스트. examine the result of a blocking operation
- 기존의 비동기 테스트에서 사용하는 expectation 을 써서 테스트하는 것보다 더 간략하게 코드를 짤 수 있다
func testToArray() {
let scheduler = ConcurrentDispatchQueueScheduler(qos: .default)
let toArrayObservable = Observable.of(1, 2).subscribeOn(scheduler)
//async -> toBlocking -> sync
XCTAssertEqual(try! toArrayObservable.toBlocking().toArray(), [1, 2])
}
- expect 를 보다 간략하게 표현할 수 있다