2016-04-15 27 views
-1

我有一個問題,我不知道,甚至幾個小時的嘗試和錯誤,谷歌搜索和stackoverflowing後的解決方案。模擬最初的viewController - 代碼覆蓋率結果

我有一個視圖控制器。我想通過每個依賴注入一個對象。該對象來自協議。一般來說,設置單元測試不是問題。還有嘲笑作品和單元測試正在運行。那麼問題在哪裏?

我在我的主要目標測試只有一個類。這個類與視圖控制器完全無關。但代碼覆蓋率顯示了覆蓋視圖控制器的體面百分比值。過了一段時間後,我發現當我點擊「測試」按鈕時,項目被執行,就像我按下「運行」按鈕一樣。因爲視圖控制器被初始化和創建,我沒有機會首先傳遞另一個依賴,或者在測試執行之前。

所以我需要的方法的測試運行和實際運行之間進行區分,在一種情況下的真實物體和在另一種情況下的假對象傳遞。

而我的問題是,如何去?我想知道爲什麼沒有人有這個問題。我的意思是,如果代碼覆蓋工具向我展示了即使我沒有測試過這些方法,也會給我提供代碼覆蓋工具。

唯一的一個類,我測試:

The one and only class that I am testing

而這些都是覆蓋率結果(酒吧僅有灰色,因爲Xcode中失去截圖中的焦點,否則他們是藍色。):

enter image description here

所以我期待看到覆蓋的結果只是類我測試,而不是一切。我知道爲什麼這個問題依然存在。視圖控制器有一個依賴關係,並且這個依賴關係在被初始化後會創建更多的類,等等。我想要做的是在單元測試期間傳遞一個假對象,並在實際運行過程中傳遞一個真實對象。就像它在Visual Studio中的非UI測試一樣:如果執行測試,應用程序不會啓動。測試運行者只是初始化測試對象,就這些。這就是我想爲iOS單元測試實現的目標。我想我錯過了某事。很重要的:(

回答

0

對於我們所有人來說誰都有或將有同樣的問題。解決的辦法是測試運行指定的環境變量。之後,你可以檢查您是否有這樣的代碼運行單元測試(假設您已創建一個名爲「InTestMode」的環境變量,並在測試運行期間將該值設置爲「1」:

 let dict = NSProcessInfo.processInfo().environment 

     if let env = dict["InTestMode"] as? String? 
     { 
      return env == "1" 
     } 

     return false