2016-01-20 33 views
0

測試時,我需要清除我的應用程序的ios鑰匙串存儲,然後在我的初始viewController的「viewDidLoad」中運行 初始化代碼。這似乎發生在我有權訪問的任何內容之前。事情我已經嘗試:如何在測試期間清除IOS Keychain用於應用程序初始化

  1. 更換AppDelegate中有MockAppDelegate(不工作,因爲最初的AppDelegate代碼執行和打破了測試之前,我可以取代它)
  2. 在XCTest設置清除鑰匙鏈() (當然)
  3. 清除鑰匙扣每次測試後我的應用程序初始化之前(沒有第一次測試工作)

如何清除鑰匙串?我會想象在AppDelegate被初始化之前做到這一點最簡單 - XCTest是否提供了任何方式來執行此操作?

任何幫助,非常感謝。謝謝!

+0

爲什麼,如果你指定一個MockAppDelegate並在AppDelegate中仍然執行? –

+0

似乎XCTest setup()函數運行得不夠早,無法保持初始化代碼的運行 - 我第一次更換AppDelegate的機會似乎是在應用程序初始化後纔出現的,所以它將使用我的原始AppDelegate啓動應用程序。 – lonesomewhistle

回答

1

http://qualitycoding.org/app-delegate-for-tests/

更換應用程序委託中main。如果您使用的Xcode 7.0,7.1或7.2,您必須在您的生產目標,測試應用程序的委託:

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 
#import "TestingAppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     BOOL isTesting = NSClassFromString(@"XCTestCase") != Nil; 
     Class appDelegateClass = isTesting ? [TestingAppDelegate class] : [AppDelegate class]; 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass)); 
    } 
} 

在Xcode的7.3,蘋果已經固定的東西,這樣的測試應用程序的委託可以住在測試目標所在地:

#import <UIKit/UIKit.h> 
#import "AppDelegate.h" 

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

以下是一些人在Swift中如何做的。而不是創建一個TestingAppDelegate的,他們只是使用nil

import UIKit 

private func delegateClassName() -> String? { 
    return NSClassFromString("XCTestCase") == nil ? NSStringFromClass(AppDelegate) : nil 
} 

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, delegateClassName()) 

如需進一步討論,請參見How to Easily Switch Your App Delegate for Testing

+0

啊!我多次遇到你的博客,每次都非常有幫助!任何想法,主要的Swift等價位置是什麼? – lonesomewhistle

+0

@lonesomewhistle我添加了一個來自博客帖子討論的Swift示例。 –

相關問題