lgvv98

[XCTest] RxTest 와 RxBlocking에 대해서 알아보자 본문

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를 사용하는게 좋다.

Comments