Post

Mirror를 이용한 Private Property Test

ReactorKit과 같은 Binding을 이용한 아키텍쳐에서는 Unit Test를 작성할 때 Stream의 끝은 UIBinding일 경우가 많기때문에 이럴경우는 해당 메소드의 값이 View Property에 바인딩이 잘 되었는지 테스트를 해야한다고 생각한다. 하지만 대부분의 UI Property의 경우 private접근자로 선언되어 있어 XCTest에서 접근이 불가하다. 이럴 경우 UI Test를 사용하지 않아도 Unit TestMirror를 이용해 간단하게 테스트를 해볼 수 있다.

1
2
3
4
5
6
7
8
9
10
final class ViewController: UIViewController { 
  private let titleLabel: UILabel
  ...
  
  func bind() { 
    viewModel.text
    .bind(to: titleLabel.rx.text)
    .disposed(by: disposeBag)
  }
}
1
2
3
4
5
6
7
final class ViewModel { 
  public var textStream: PublisedSubject<String> = .init()
  
  public func chanedText(_ text: String) { 
    textStream.onNext(text)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
final class ViewModelTests { 
  func test_ViewModel_TextStream() { 
    viewModel = ViewModel()
    
    let viewController = ViewController(viewModel: viewModel)
    let mirror = Mirror(reflecting: viewController)
    
    // RxText 는 생략
    viewModel.chanedText("chaned Text")
    
    let text = mirror
      .children
      .filter { $0.label == "titleLabel" }
      .map { $0.value }
      .compactMap { $0 as? UILabel }
      .map { $0.text }
      .first!
    
    XCTAssetEqual(text, "changed Text)
  }
}
This post is licensed under CC BY 4.0 by the author.