본문 바로가기
iOS/Testing

iOS 유닛 테스트를 배워보자!(3) - 마지막

by HaningYa 2020. 4. 24.
728x90

 

[참고한 튜토리얼]

 

iOS Unit Testing and UI Testing Tutorial

Learn how to add unit tests and UI tests to your iOS apps, and how you can check on your code coverage.

www.raywenderlich.com

https://haningya.tistory.com/35

 

iOS 유닛 테스트를 배워보자!(2)

[참고한 튜토리얼] iOS Unit Testing and UI Testing Tutorial Learn how to add unit tests and UI tests to your iOS apps, and how you can check on your code coverage. www.raywenderlich.com iOS 유닛 테스..

haningya.tistory.com



Mock 객체를 이용해서 가짜 업데이트를 해보겠다.

이전에는 가짜 객체로 부터의 입력을 위해 stub 를 사용해 보았다. 

 

다음으로 mock object을 사용할 건데 UserDefaults의 값들이 제대로 수정되는지 확인해 볼것이다.

BullsEye 프로젝트에서 앱은 두가지 게임 스타일이 존재한다. 

사용자가 slider를 target value에 맞게 이동하거나 slider 로 부터 target value를 예측하는 것이다.

segmented control 은 게임 스타일이 바뀔때 스타일을 User Default에 저장하도록 동작한다.

 

Test navigator에서 새로운 유닛 테스트 클래스를 만들고 BullsEyeMockTests라고 이름을 정한다.

@testable import BullsEye

class MockUserDefaults: UserDefaults {
  var gameStyleChanged = 0
  override func set(_ value: Int, forKey defaultName: String) {
    if defaultName == "gameStyle" {
      gameStyleChanged += 1
    }
  }
}

 

MockUserDefaults는 set(_: forKey:) 를 오버라이드 해 gameStyleChanged 플래그를 증가시킨다.

Bool 변수를 통해 테스트를 할 수 도 있지만 Int가 좀더 유연한 테스트를 제공해 준다.(몇번 called 됬는지와 같은)

 


SUT와 Mock Object를 BullsEyeMockTests에 선언한다.

var sut: ViewController!
var mockUserDefaults: MockUserDefaults!

그리고 기본 setUp()과 tearDown()을 다음 코드로 바꾼다. 아래 함수는 SUT와 mock object를 만들어 SUT 의 프로퍼티로 mock object를 주입한다.

override func setUp() {
  super.setUp()

  sut = UIStoryboard(name: "Main", bundle: nil)
    .instantiateInitialViewController() as? ViewController
  mockUserDefaults = MockUserDefaults(suiteName: "testing")
  sut.defaults = mockUserDefaults
}

override func tearDown() {
  sut = nil
  mockUserDefaults = nil
  super.tearDown()
}

 

그리고 두가지 기본 test 함수를 다음과 같이 수정한다. 

func testGameStyleCanBeChanged() {
  // given
  let segmentedControl = UISegmentedControl()

  // when
  XCTAssertEqual(
    mockUserDefaults.gameStyleChanged, 
    0, 
    "gameStyleChanged should be 0 before sendActions")
  segmentedControl.addTarget(sut,
    action: #selector(ViewController.chooseGameStyle(_:)), for: .valueChanged)
  segmentedControl.sendActions(for: .valueChanged)

  // then
  XCTAssertEqual(
    mockUserDefaults.gameStyleChanged, 
    1, 
    "gameStyle user default wasn't changed")
}

테스트를 실행해 보면

성공한다.


  • UI Testing
  • Performance Testing
  • Code coverage

가 남았는데 시간이 없어서 이쯤에서 먼저 마무리한다.

 

728x90

'iOS > Testing' 카테고리의 다른 글

WWDC Testing related Videos list  (0) 2021.05.25
iOS 유닛 테스트를 배워보자!(2)  (0) 2020.04.04
iOS 유닛 테스트를 배워보자!(1)  (0) 2020.04.03

댓글