ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.