728x90
https://haningya.tistory.com/35
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 |
댓글