ios 개발에서 TDD를 수행하기 위해 최소한으로 유지

TDD에 한하지 않고 단위 테스트를 실행하면 일찍 결과를 원할 것입니다.
ios 개발에서는, 아무것도 생각하지 않고 쓰면 AppDelegate가 불려, Controller가 불려…

아는 사람에게는 당연한 해결 방법입니다만, 의외로 일본어 기사가 적었으므로, 후배를 위해서 쓰고 있습니다.

Main Interface를 코드로 작성



아래의 부분을 쓰고 있으면 테스트를 동작시키면 거기의 Controller가 움직이므로 지워 둡니다.



위의 대신 코드로 쓸 때.

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

        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        window.rootViewController = storyboard.instantiateInitialViewController()
        window.makeKeyAndVisible()

        return true
    }

main 함수 만들기



우선, 자신의 main 함수를 동작시키고 싶으므로, AppDelegate 클래스의 @UIApplicationMain 를 삭제해 둡니다.
-@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate {

그런 다음 다음 파일을 만듭니다.

main.swift
let appDelegateClass: AnyClass? =
    NSClassFromString("テストターゲット名.TestingAppDelegate") ?? AppDelegate.self
let args = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
UIApplicationMain(CommandLine.argc, args, nil, NSStringFromClass(appDelegateClass!))

Objective-C에서는 다음과 같습니다.

main.m
int main(int argc, char *argv[]) {
    @autoreleasepool {
        Class appDelegateClass = NSClassFromString(@"TestingAppDelegate");
        if (!appDelegateClass) {
            appDelegateClass = [AppDelegate class];
        }
        return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));
    }
}

테스트용 AppDelegate 만들기



다음 파일을 테스트 대상에 넣습니다.

TestingAppDelegate.swift
class TestingAppDelegate: NSObject {
    var window: UIWindow?
}

Objective-C에서는 다음과 같습니다.

TestingAppDelegate.h
@interface TestingAppDelegate : NSObject
@property(nonatomic, strong) UIWindow *window;
@end

TestingAppDelegate.m
@implementation TestingAppDelegate
@end

이상입니다.

좋은 웹페이지 즐겨찾기