-
Unit test 시작하기iOS 2021. 12. 29. 16:35
* 우선 Unit Test의 중요성을 알고 시작하는게 중요하다고 생각된다.
내가 짠 코드가 Testable한 구조로 되어있는지 늘 생각하며 코드를 작성하는게 중요하고
필자는 Ribs 구조로 되어있는 토이프로젝트에 Ribs Unit Test를 활용해 작성했다.
세팅부터 다시 시작
1. 이미 있는 프로젝트에 Test 를 추가하는 경우
왼쪽 아래 하단 + 를 통해 Tests를 추가한다.
2. 혹시 Pod 파일이 있는경우
Test에 필요한 부분이 생기면 아래처럼 수정 (예시)
target 'MyTestApp' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for MyTestApp pod 'RIBs', git: 'https://github.com/uber/RIBs.git', branch: 'master', submodules: true pod 'Moya/RxSwift' pod 'SwiftLint' pod 'RxCocoa' target 'MyTestAppTests' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for MyTestAppTests pod 'RIBs', git: 'https://github.com/uber/RIBs.git', branch: 'master', submodules: true pod 'Moya/RxSwift' end end
이러면 준비는 모두 완료되었고
3. Unit Tests 파일 생성
테스트 하고 싶은 Rib과 같은 이름으로 생성( 그이름으로 Interactor,Router 등이 생성됨)
4. 1차 적으로 Mock 만들기
// // AppRootInteractorTests.swift // MyTestAppTests // @testable import MyTestApp import XCTest // cmd + shift + U : test build final class AppRootInteractorTests: XCTestCase { private var sut: AppRootInteractor! // 검증 대상(system under test) private var presenter: AppRootPresentableMock! private var dependency: AppRootDependencyMock! // TODO: declare other objects and mocks you need as private vars override func setUp() { super.setUp() // Mock 객체를 생성한다. self.presenter = AppRootPresentableMock() self.dependency = AppRootDependencyMock() sut = AppRootInteractor(presenter: self.presenter, dependency: self.dependency) } // MARK: - Tests func test_exampleObservable_callsRouterOrListener_exampleProtocol() { // This is an example of an interactor test case. // Test your interactor binds observables and sends messages to router or listener. } }
AppRootMock 파일 따로 생성
// // AppRootMock.swift // MyTestAppTests // import Foundation import Moya import RxSwift @testable import MyTestApp final class AppRootPresentableMock: AppRootPresentable { var listener: AppRootPresentableListener? // 구현해줘야하는 메소드도 fix 하면 바로 불러올 수 있음. //해당 메소드가 불렸는지, 몇번 불렸는지 count 하거나 실제 값을 검증할 수 있음. init() {} } final class AppRootDependencyMock: AppRootInteracorDependency { var appRootRepository: AppRootRepository = AppRootRepositoryMock() } final class AppRootRepositoryMock: AppRootRepository { var rootRequestModel: RootRequestModel = RootRequestModel() var getRootInfoCallCount = 0 var provider: MoyaProvider<RootService>? var shouldSucceed: Bool = true func getRootInfo(_ provider: MoyaProvider<RootService>) -> Single<RootModel> { getRootInfoCallCount += 1 self.provider = provider if shouldSucceed { return Single.just(RootModel()) } else { return Single.error(NSError(domain: "AppRootRepositoryMock", code: 0, userInfo: nil)) } } init() {} }
728x90'iOS' 카테고리의 다른 글
M1 설치 오류들 (0) 2022.03.21 Tuist 설치방법 (0) 2022.01.10 Xcode Simulator가 나오지 않을때 (0) 2021.11.18 KxCoding (iOS, Swift 강좌 추천) (0) 2021.08.10 tcpdump 보기 (0) 2021.07.30