2012-01-16 37 views
4

我有一些Objective-C [i-os]代碼,我想使用XCode運行單元測試。這取決於設備的類型,訪問不同的元數據,使用:如何測試取決於UIUserInterfaceIdiom(ios)的代碼

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

我的問題是,當我運行單元測試,這一結果總是正確的。理想情況下,能夠將其設置爲測試運行將是非常好的。

我猜測它可以做的方式是創建一個封裝設備檢查和模擬測試的類。但我認爲可能值得看看是否有更好的解決方案。

僅供參考,一個nice blog post with many links,蘋果Unit testing guideUnit test sample code project

回答

4

今天早上我嘗試了幾種不同的方法:

  1. 使用的類別,只鏈接到我的測試目標。在那個類別中,我將覆蓋currentDevicepartialMock實現(OCMock)並存根必要的方法,以便它將Pad或Phone強制返回到我的特定測試。它應該有工作,但是很難混淆類如或UIApplication,模擬器經常崩潰,這是一個不好的跡象。

  2. #undef UI_INTERFACE_IDIOM()#define它在我的測試.pch。將測試中的UI_INTERFACE_IDIOM()實現指向我自己的單例實例,以便相應地設置爲Pad或Phone。這很有效,但主要問題是,當你運行測試時,模擬器也會升高(應用程序測試),所以如果你在iPad上運行你的測試,你的測試會通過,但模擬器的其他部分將失敗,因爲從UI_INTERFACE_IDIOM()(其中之一是如果您處於通用應用程序環境中,加載了特定於iPhone的筆尖)

  3. 我認爲這是最好的方法。與計算機科學中的所有內容一樣,只需將另一個圖層放入=)代替使用UI_INTERFACE_IDIOM()的代碼來評估它是否在Pad或Phone設備上,請將此邏輯封裝在可在測試期間模擬的對象中。這種方式UI_INTERFACE_IDIOM()仍然可用於模擬器的其餘部分。你的生產代碼實際上依賴於它,但是你的測試將依賴於一個可以在你的測試中按預期做出反應的存根實現。

如果您願意,我可以分享一些關於此事的代碼。是的,這是一個疲憊的!

您是如何設法解決這個問題的?

+0

歡迎來到SO和漂亮的第一個答案! +1。恐怕我暫時放棄了這一項 - 自動化測試在我的工作場所中是一個骯髒的詞,我更關心首先獲得源代碼控制。話雖如此,我希望最終得以實現,似乎自動化測試比現在應該更加困難。任何額外的細節,你可以給予讚賞。謝謝。 – 2012-07-02 03:50:56

+0

無論你做什麼,不要放棄!也許這將有助於:http://www.amazon.com/Test-Driven-iOS-Development-Developers-Library/dp/0321774183 – 2012-07-03 01:26:01

+0

感謝您的鏈接!我會看看。 – 2012-07-10 01:02:32