由於一些問題,我想讓項目中的XCTest目標運行一個單獨的應用程序委託。使用ObjC,這是一個相對直接的過程:操作main.m
(請參閱:https://stackoverflow.com/a/15725328/1299041)。iOS Swift:XCTest的獨立AppDelegate
由於在AppDelegate中似乎Swift應用程序初始化爲@UIApplicationMain
,是否可以使用單獨的AppDelegate爲測試目標初始化?
由於一些問題,我想讓項目中的XCTest目標運行一個單獨的應用程序委託。使用ObjC,這是一個相對直接的過程:操作main.m
(請參閱:https://stackoverflow.com/a/15725328/1299041)。iOS Swift:XCTest的獨立AppDelegate
由於在AppDelegate中似乎Swift應用程序初始化爲@UIApplicationMain
,是否可以使用單獨的AppDelegate爲測試目標初始化?
強烈建議在正常的代碼檢查中添加條件,如果它正在測試。相反,你應該在測試中嘲笑你的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
}
}
如果你仍然想停止執行代碼的測試,這是我的方法行之有效:
可以啓動參數添加到應用程序,它表明這是試運行
這些參數可以訪問來自NSUserDefaults
#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"]
該解決方案是如下:
複製現有應用程序的目標和其重命名爲合適的東西。在你的情況下,也許'TestingHarness'或其他一些。請注意,您還需要更改包標識符並重命名相應的Info.plist文件。重命名Info.plist文件意味着您需要更改新目標的「生成設置」選項卡中的Info.plist文件名設置以匹配新名稱。
創建另一個*AppDelegate.swift
文件。在你的情況下,我會叫它TestAppDelegate.swift
。
將您現有的AppDelegate.swift
文件內容複製到TestAppDelegate.swift
並根據需要進行編輯。請務必保留@UIApplicationMain
註釋並執行所需的UIApplicationDelegate
回調。
更改每個*AppDelegate.swift
文件的目標會員,這樣AppDelegate.swift
不包括在新的「TestHarness」目標和TestAppDelegate.swift
不包含在你的主要應用程序的目標。 (您可以通過在文件瀏覽器中選擇文件並打開文件檢查器來編輯文件的目標成員資格,默認情況下您可以在右側欄中或通過在查看 - >實用工具下的菜單中選擇文件檢查器。)
現在,您有兩個單獨的目標,它們具有獨立的App Delegates,您可以獨立構建和運行。最後一步是選擇新的'TestHarness'目標作爲測試目標的主機應用程序。 (點擊文件瀏覽器的頂級項目條目,然後點擊子上市所需的測試目標。在常規選項卡,你會看到爲唯一下跌主機應用程序了。)
注意:這些說明適用於Xcode 7.2。
這是一個很好的觀點,我同意避免向正常代碼添加測試相關條件。我實際上試圖做的是停止在主AppDelegate中執行代碼(處理用戶和會話狀態以及數據存儲)。不幸的是,創建一個'MockAppDelegate'沒有完成。 – Whoa
我編輯了我的答案,有一種方法可以在Swift中檢查這一點。只需在您的應用程序委託中放入「if」語句即可。 –
這不會阻止正常的應用程序委託運行,是嗎?我的意思是,在測試套件開始運行之前,通常AppDelegate的'didFinishLaunchingWithOptions'被觸發。 –