iOS 개발에서 TDD를 위한 준비

10953 단어 XcodeiOSTDD

소개



iOS 개발에서 TDD 할 때 준비해 두면 좋은 것을 기재했습니다.
개인적인 비망록도 겸하고 있기 때문에 알기 어려운 부분 있을지도 모릅니다.
마음이 가면 내용을 좀 더 충실하게 만들거나 샘플 프로젝트를 추가하고 싶습니다.

Main Interface 삭제



Main Interface를 삭제합니다.
기본값은 Main.Storyboard로 설정되어 있습니다.


AppDelegate 설정



위에서 Main Interface를 삭제한 대신 코드에서 window rootViewController를 지정합니다.

AppDelegate.swift
import UIKit

@UIApplicationMain
final class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = SetUpVC() // 任意のViewController
        window?.makeKeyAndVisible()

        return true
    }
}

main.swift의 자체 구현



main.swift를 준비합니다.
main 함수를 실행하려면 AppDelegate에서 @UIApplicationMain를 제거합니다.

main.swift
// Xcode10
UIApplicationMain(CommandLine.argc,
                  CommandLine.unsafeArgv,
                  NSStringFromClass(UIApplication.self),
                  NSStringFromClass(AppDelegate.self))

// Xcode8 or 9
UIApplicationMain(CommandLine.argc,
                  UnsafeMutableRawPointer(CommandLine.unsafeArgv)
                    .bindMemory(
                        to: UnsafeMutablePointer<Int8>.self,
                        capacity: Int(CommandLine.argc)),
                  NSStringFromClass(UIApplication.self),
                  NSStringFromClass(AppDelegate.self))

추기: Xcode10에서는, 제 2 인수를 UnsafeMutableRawPointer 를 이용하지 않고 기술할 수 있게 되었습니다.
( @yukkobay 씨 정보 제공 해 주셔서 감사합니다)

테스트용 AppDelegate 만들기



테스트 빌드 시 시작할 AppDelegate를 준비합니다.

TestAppDelegate.swift
import UIKit

final class TestAppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func applicationDidFinishLaunching(_ application: UIApplication) {

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = UIViewController() // 任意のViewController
        window?.makeKeyAndVisible()
    }
}

환경 변수를 설정하고 참조할 수 있도록



Build Scheme에 따라 모든 AppDelegate를 시작하기위한 사전 준비로 환경 변수를 설정합니다.

여기에서는 위에서 만든 TestAppDelegate를 시작하기 위해 테스트 빌드의 Arguments 설정에 환경 변수를 추가합니다.
  • Product > Scheme > Edit Scheme 을 선택
  • Environment Variables 항목에서 임의의 Key 및 Value 설정



  • 아래 코드에서 Value 값을 참조할 수 있습니다.
    ProcessInfo.processInfo.environment["設定したKey"]
    

    잘 사용할 수 있도록 래퍼를 준비하면 좋을 것 같습니다.

    Global.swift
    struct Global {
        static var isUnitTest: Bool {
            return ProcessInfo.processInfo.environment["isUnitTest"] == "true"
        }
    }
    

    main.swift 수정



    main.swift
    import UIKit
    
    private var appDelegateName: String {
        if Global.isUnitTest {
            return NSStringFromClass(TestAppDelegate.self)
        } else {
            return NSStringFromClass(AppDelegate.self)
        }
    }
    
    UIApplicationMain(CommandLine.argc,
                      UnsafeMutableRawPointer(CommandLine.unsafeArgv)
                        .bindMemory(
                            to: UnsafeMutablePointer<Int8>.self,
                            capacity: Int(CommandLine.argc)),
                      NSStringFromClass(UIApplication.self),
                      appDelegateName)
    

    이제 Build Scheme에 따라 모든 AppDelegate를 시작할 수 있도록 수정했습니다.

    환경


  • Xcode 9.2
  • Swift 4.0

  • 참고



  • ios 개발에서 TDD를 수행하기 위해 최소한으로 유지 @ko2ic
  • 좋은 웹페이지 즐겨찾기