2015-04-06 38 views
1

KIF像魔術一樣工作,最近讓我很困惑。這就是KIF和XCTest的工作原理。如何設置我的應用程序在XCTest下運行時會看到的標誌?

據說WWDC 2014 & 2013:測試代碼作爲一種插件被注入宿主應用程序,那麼什麼信息可以作爲插件從主應用程序中竊聽? 主機應用程序 & 插件是什麼關係?

使用KIF,我們可以感知通知& URL請求,但這是如何工作的?我的第一個想法是主機應用程序中的所有上下文都與插件共享但爲什麼在測試中,我們無法修改主應用程序中的變量?

例如:

,我們有兩個目標:

魔術項目

- MagicApp

- MagicUITest < - KIFTest目標

假設我有一個檔案名爲MagicClass:

class MagicClass { 
    static var a = 1 
} 

如果我想在MagicUITest中修改該變量,那麼可能嗎?

我現在面臨的問題是如何注入不同的UIViewController到RootViewController,以便我可以從每個單獨的ViewController運行KIF測試,並且不需要麻煩通過登錄過程所有的時間..我的猜測是東西像:

在MagicApp:

class AppDelegate : .. , .. { 
    func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { 
    if MagicClass.a == 1 { 
     window.rootViewController = AViewController() 
    } else { 
     window.rootViewController = BViewController() 
    } 
    } 
} 
在KIFTest的設定()

setUp() { 
    Magic.a = 2 
} 

但不會工作。

一件事是Magic.a = 2不會改變在MagicApp的Magic.a,第二是應用(..,..,..)功能設置()被調用之前將結束..

有什麼想法?

回答

1

雖然您確定您嘗試的確切代碼無效,但您仍可以使用非常類似的方法。

此代碼,例如,直接從應用程序那兒剽竊我現在工作在一個名爲RootViewController類的(你猜對了)應用程序的根視圖控制器:

public override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    if NSProcessInfo.processInfo().environment["TESTING"] == nil { 
     loadChildren() 
    } 
} 

它做什麼正在尋找一個環境變量來決定它是否應該自動繼續加載應用程序,並且如果它找到環境變量,它會等待測試堆棧完成設置並告訴它下一個要加載的應用程序的哪一部分。 (如果它是一個非常小的應用程序,您也可以在您的應用程序委託中執行此操作。)

您可以通過在Xcode編輯計劃設置環境變量: Screen shot describing adding an environment variable

所有這一切說,雖然:使用此策略時要小心。您希望測試能夠測試應用程序中存在的應用程序的功能,並且如果任意顯示不同的屏幕是應用程序的功能,那可能就沒有問題。但是,如果您開始編寫代碼,使得您的應用在測試時的行爲不同,那麼您不再真正測試您的應用,是嗎?

+0

謝謝!我會試試看。我們希望讓應用程序行爲不同的情況主要與模擬網絡響應有關。例如,將自定義的NSURLProtocol註冊到NSURLSession的protocolsArray。 – 2015-04-13 20:29:34

相關問題