Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] 3. 유닛 테스트 방법 - RxExpect를 이용한 Rx관련 비동기 테스트 코드 구현 방법 본문

iOS 응용 (swift)

[iOS - Swift] 3. 유닛 테스트 방법 - RxExpect를 이용한 Rx관련 비동기 테스트 코드 구현 방법

jake-kim 2022. 12. 12. 22:54

1. 유닛 테스트 방법 - Dependency Injection (@Injected) 주입 구조

2. 유닛 테스트 방법 - Quick과 Nimble을 이용한 테스트 코드 구현 방법

3. 유닛 테스트 방법 - RxExpect를 이용한 Rx관련 비동기 테스트 코드 구현 방법 <

번외) 유닛 테스트 방법 - XCTest와 RxSwift만을 이용한 비동기 테스트 구현 방법

 

RxExpect

  • 시간에 따른 특정 값을 테스트 하고 싶은 경우 사용
  • input으로 특정 시간과 특정 이벤트를 발생시켰을때 기대되는 값이 존재하는지 보는 것
  •  

RxExpect 사용 방법

  • RxSwift, RxCocoa, RxTest의 종속성을 가지고 있는 프레임워크

https://github.com/devxoul/RxExpect/blob/master/RxExpect.podspec

  • input, assert 메소드가 있으며 이 메소드를 통해 Observer, Observable 타입을 테스트 가능

ex) viewModel 준비

  • plusPublish를 방출하면 cntBehavior에 값이 기록
  • 테스트: plusPublish에 값을 방출해보고, cntBehavior에 값이 잘 적용되는지 테스트
public class ViewModel {
    public let plusPublish = PublishSubject<Int>()
    public let cntBehavior = BehaviorSubject<Int>(value: 0)
    
    init() {
        plusPublish
            .subscribe(onNext: { [weak self] plus in
                guard let ss = self else { return }
                let previous = try! ss.cntBehavior.value()
                ss.cntBehavior.onNext(previous + plus)
            })
            .disposed(by: disposeBag)
    }
}
  • RxExpect 사용하여 테스트
    • observable: input으로 observer 타입을 놓고 .next로 시간에 따른 값 방출
    • observer: assert로 값을 관찰하여, events 인수에 들어있는 결과값들을 비교
final class RxExpectTests: XCTestCase {
    func testSome() {
        var sut: ViewModel!
        var rxExpect: RxExpect!
        
        sut = ViewModel()
        rxExpect = RxExpect()
        rxExpect.retain(sut) // 테스트 도중 메모리 해제 방지
        
        rxExpect.input(sut.plusPublish, [
            .next(10, 1),
            .next(20, 2),
            .next(30, 100)
        ])
        
        rxExpect.assert(sut.cntBehavior) { events in
            expect(events.elements).to(equal([0, 1, 3, 103]))
        }
    }
}

* 참고

https://github.com/devxoul/RxExpect/blob/master/RxExpect.podspec

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/HotAndColdObservables.md

https://medium.com/free-code-camp/testing-in-rxswift-2b6eeaeaf432

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/UnitTests.md

Comments