簡體   English   中英

使用Xcode 7 UI Automation模擬對象

[英]Mocking objects with Xcode 7 UI Automation

到目前為止,我正在使用KIF Framework進行iOS UI自動化。 KIF(也是單元測試)目標在與應用程序運行相同的過程中運行單元/ UI測試代碼,我們可以輕松模擬應用程序使用的不同對象/類來顯示模擬數據。

當切換到基於Xcode 7的新UI自動化時,我發現UI單元測試目標在單獨的進程中運行,並且它在單獨的進程中啟動應用程序。 因此,無法通過單元測試訪問App類/對象並模擬它們。

有沒有人面臨同樣的問題,並了解任何解決方法?

如果需要更多細節,請告訴我。

答:請參閱下面的詳細答案。 此處還有來自Apple開發者的回復鏈接: https//forums.developer.apple.com/thread/23552

因為您在不同的進程中運行,所以沒有辦法通過測試將mocks注入您的應用程序。 話雖如此,您確實可以控制應用程序的進程,因此可以對其產生一些影響。

我已經來回了解我對此的NSProcessInfo (我目前還未定),但您可以在應用中添加一些代碼來讀取環境變量(通過NSProcessInfo ),使應用程序的行為不同(即更改)你的依賴注入注入你的類,所以它使用模擬)。

這樣做的缺點是模擬代碼沒有嚴格包含在測試包中,並且您最終會在應用程序中使用該代碼(除非您使用#if語句來隔離它)。 顯然,謹慎處理代碼分支也很重要,因此不要使測試無效。

您可以在UI測試中啟動應用程序之前設置環境變量:

let app = XCUIApplication()
app.launchEnvironment = ["UITestUseMocks" : "true"]
app.launch()

然后在您的應用程序中,您可以檢查它,可能在#if語句中並更改您的行為:

#if TEST_TARGET
    if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" {
        // Alter services used in dependency injection or some other testing behavior
    }
#endif

我一直在考慮這種方法來實現一個模擬服務層,它只是重放一些罐裝服務器響應,所以我可以讓我的UI測試不依賴於服務器響應(畢竟其他東西測試服務器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM