apple/XCTest
[XCTest] RxTest 와 RxBlocking에 대해서 알아보자
lgvv
2022. 2. 20. 15:31
RxTest / RxBlocking
✅ 테스트에 대해서 알아보자.
Rx... 얘내 도대체 어떻게 테스트할까 고민 많이 했었는데, 이런 도구들이 있다니!
여담이지만 이런거 Kuring프로젝트 하시는 분의 테스트코드 보는데 약간 치임;;
Swift에서 제공하는 것만으로도 충분하다고 생각했는데 굳이 Rx를 하는게 도움이 클까?? 생각도 들지만 아무튼 공부해보자
(UIButton의 rx.tap 못쓴다고 생각하니 공부해야겠ㄷ.ㅏ)
🟠 RxTest란?
Observable의 가상의 시간 개념을 주입해서 테스트하는 방법으로 가상의 시간이 다 흐를때까지 기다린 후에 이벤트를 반환할 수 있어.
각 초에 문자하나 방출한다고 가정
1초 -> "A"
2초 -> "B"
3초 -> "C"
// 2sec에 B가 나왔는지 검증
✅ RxTest
// 가상의 시간 흐름 생성
let scheduler = TestScheduler(initialClock: 0)
// 원하는 시점에 Event가 발생하는 Observable 생성(구독 여부와 관계없이 이벤트 발생)
let obsevable = scheduler.createHotObservable([
.next(1, "A"),
.next(2, "B"),
.next(3, "C")
])
// 원하는 시점에 Event가 발생하는 Observable 생성(구독이 시작되어야 정해진 순서대로 이벤트 발생)
let obsevable = scheduler.createColdObservable([
.next(1, "A"),
.next(2, "B"),
.next(3, "C")
])
// String을 관찰하는 Observer 생성
let observer = scheduler.createObserver(String.self)
// 관찰자를 통해서 테스트하고자 하는 옵저버블 구독
obsevable
.subscribe(observer)
.disposed(by: bag)
// 관찰시작
scheduler.start()
// Nimble 문법을 활용한 Test Assertion
expect(observer.events).to(
equal([
.next(1, "A"),
.next(2, "B"),
.next(3, "C")]
)
위에보면 Hot이랑 Cold 나오는데, Rx처음 공부할때 무지 어렵던거 이제 다 이해가능 ㅎ~!
🟠 RxBlocking이란?
Observable의 이벤트 방출하고 특정 시간동안 방출된 Observable의 이벤트를 검증
RxTest에 있었던 스케줄러란 개념은 없음
각 초에 문자하나 방출한다고 가정
1초 -> "A"
2초 -> "B"
3초 -> "C"
// ["A","B","C"]
✅RxBlocking
// Observable -> BlockingObservable
let obsevable = Observable.of("A","B","C").toBlocking()
// Observable의 .next 이벤트를 Array로 전환
let values = try! observable.toArray() // 어레이 전환이 컴플릿 될 때까지 대기
// Nimble의 문법 활용한 Test Assertion
expect(values).to(equal(["A","B","C"]))
만약 컴플릿이 되지 않아도 수행하려면 .toBlocking(timeout: 2) 이런식으로 인자값을 주면 된다.
단순히 방출되는 값만 필요하다면 블록킹으로도 충분하고
스케줄러의 개념이 들어가야한다면 test를 사용하는게 좋다.