iOS 개발에서 TDD를 위한 준비
소개
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 설정에 환경 변수를 추가합니다.
아래 코드에서 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를 시작할 수 있도록 수정했습니다.
환경
참고
ios 개발에서 TDD를 수행하기 위해 최소한으로 유지 @ko2ic
Reference
이 문제에 관하여(iOS 개발에서 TDD를 위한 준비), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yutuno/items/901f8210791417732a21텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)