Skip to content

Instantly share code, notes, and snippets.

@torpedo87
Last active January 22, 2019 06:56
Show Gist options
  • Save torpedo87/fd670c928dbd1a78eef81a577a33b860 to your computer and use it in GitHub Desktop.
Save torpedo87/fd670c928dbd1a78eef81a577a33b860 to your computer and use it in GitHub Desktop.
RxTest

RxTest

  • 에러가 맞는지 확인하는 경우의 테스트는 에러가 일치하는지를 테스트하지 말고 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
}

sync test

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

async test

RxBlocking

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

RxNimble

  • expect 를 보다 간략하게 표현할 수 있다
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment