2015-01-13 29 views

回答

11

強烈建議在正常的代碼檢查中添加條件,如果它正在測試。相反,你應該在測試中嘲笑你的AppDelegate做任何你想做的事情。

然後你可以在你的每個XCTestCase的超級類別中替換UIApplication的代表是setUp

class MockAppDelegate:NSObject, UIApplicationDelegate { 

} 


class BaseTest: XCTestCase { 

    override func setUp() { 
     super.setUp() 
     UIApplication.sharedApplication().delegate = MockAppDelegate() 
     } 
} 
class Test1: BaseTest { 

    override func setUp() { 
     super.setUp() 
     // normal testing 
     } 
} 

如果你仍然想停止執行代碼的測試,這是我的方法行之有效:

可以啓動參數添加到應用程序,它表明這是試運行 App Start execution

這些參數可以訪問來自NSUserDefaults

#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"] 
+4

這是一個很好的觀點,我同意避免向正常代碼添加測試相關條件。我實際上試圖做的是停止在主AppDelegate中執行代碼(處理用戶和會話狀態以及數據存儲)。不幸的是,創建一個'MockAppDelegate'沒有完成。 – Whoa

+0

我編輯了我的答案,有一種方法可以在Swift中檢查這一點。只需在您的應用程序委託中放入「if」語句即可。 –

+5

這不會阻止正常的應用程序委託運行,是嗎?我的意思是,在測試套件開始運行之前,通常AppDelegate的'didFinishLaunchingWithOptions'被觸發。 –

1

該解決方案是如下:

  1. 複製現有應用程序的目標和其重命名爲合適的東西。在你的情況下,也許'TestingHarness'或其他一些。請注意,您還需要更改包標識符並重命名相應的Info.plist文件。重命名Info.plist文件意味着您需要更改新目標的「生成設置」選項卡中的Info.plist文件名設置以匹配新名稱。

  2. 創建另一個*AppDelegate.swift文件。在你的情況下,我會叫它TestAppDelegate.swift

  3. 將您現有的AppDelegate.swift文件內容複製到TestAppDelegate.swift並根據需要進行編輯。請務必保留@UIApplicationMain註釋並執行所需的UIApplicationDelegate回調。

  4. 更改每個*AppDelegate.swift文件的目標會員,這樣AppDelegate.swift不包括在新的「TestHarness」目標和TestAppDelegate.swift不包含在你的主要應用程序的目標。 (您可以通過在文件瀏覽器中選擇文件並打開文件檢查器來編輯文件的目標成員資格,默認情況下您可以在右側欄中或通過在查看 - >實用工具下的菜單中選擇文件檢查器。)

  5. 現在,您有兩個單獨的目標,它們具有獨立的App Delegates,您可以獨立構建和運行。最後一步是選擇新的'TestHarness'目標作爲測試目標的主機應用程序。 (點擊文件瀏覽器的頂級項目條目,然後點擊子上市所需的測試目標。在常規選項卡,你會看到爲唯一下跌主機應用程序了。)

注意:這些說明適用於Xcode 7.2。