Xcode에서 사용하는 테스트 클래스의 기반이 되는 XCTestCase 는 테스트에 필요한 기본적인 기능을 제공하기 때문에, 모든 테스트 클래스는 XCTestCase를 상속받아 구현해야 함
class func setup()
class func teardown()
https://github.com/Quick/Nimble
Nimble은 Apple에서 제공하는 XCTest Assertion에서 단점을 극복하기 위해 만들어짐
RxSwift/UnitTests.md at main · ReactiveX/RxSwift
ex)
[(”A”, 1초), (”B”, 2초), (”C”, 3초)]
2초에 B가 나왔는지 검증?
// 가상의 시간 흐름 생성
let scheduler = TestScheduler(initialClock: 0)
// 원하는 시점에 Event가 발생하는 Observable 생성
// createHotObservable -> 구독 여부 관계 없이 이벤트 발생
// createColdObservable -> 구독 시작되어야 정해진 순서대로 이벤트 발생
let observable = scheduler.createHotObservable([
.next(1, "A"),
.next(2, "B"),
.next(3, "C"),
])
// String을 관찰하는 Observer 생성
let observer = scheduler.createObserver(String.self)
observable
.subscribe(observer)
.disposed(by: bag)
// 가상의 시간이 모두 흐르도록
scheduler.start()
// Nimble의 문법을 활용할 Test Assertion
expect(observer.events).to(
equal([
.next(1, "A"),
.next(2, "B"),
.next(3, "C")
])
)
RxSwift/RxBlocking at main · ReactiveX/RxSwift
ex)
[”A”, “B”, “C”]
검증?
// Observable -> BlockingObservable
let observable = Observable.of("A", "B", "C").toBlocking()
// Observable의 .next 이벤트를 Array로 전환
let values = try! observable.toArray()
// Nimble의 문법을 활용한 Test Assertion
expect(values).to(equal(["A", "B", "C"))
만약 complete 되지 않은 HotObservable의 Test를 시도한다면 timeout을 설정해야함
// Observable -> BlockingObservable
let observable = Observable.of("A", "B", "C").toBlocking**(timeout: 2)**
// Observable의 .next 이벤트를 Array로 전환
let values = try! observable.toArray()
// Nimble의 문법을 활용한 Test Assertion
expect(values).to(equal(["A", "B", "C"))
Scheduler의 개념이 필요하고 좀 더 원하는 타이밍에 원하는 값이 나오기 검증을 원한다
→ RxTest
단순 Observable이 제대로 방출되는지 확인을 원한다
→ RxBlocking