2017-05-24 133 views
0

如果代碼運行測試或產品應用程序,在運行時檢測的最佳方式是什麼?在運行時檢測產品代碼或測試代碼是否在Swift中

基本上我想允許一個setter只是爲了測試目的。喜歡的東西:

class LoginService { 

    private static var LoginService instance = LoginService(); 

    public var sharedInstance: LoginService { 
      get{ 
       return instance; 
      } 

      set{ 
      if(inRunningTests()){ 
       instance = newValue; 
      } else { 
       fatalError("This setter is just for testing") 
      } 
      } 
    }   
    static func isRunningTests() -> Bool { 
     // ???? 
    } 

} 
+0

'#if DEBUG return true #else return false #endif'。在給定配置的項目設置中定義了DEBUG。 – Sulthan

+1

這是相當的代碼味道。爲什麼不創建一個單獨的'MockLoginService'來分享與LoginService相同的新協議,然後將其用於測試。 – Alexander

+0

您可以使用多態,併爲您的測試使用'MockLoginService',然後使用'ProdLoginService'的實際登錄服務,它們都從一個抽象的'LoginService'繼承。然後,根據您的環境實例化正確的服務:LoginService x =(ENV ==「TEST」)?新的MockLoginService():新的ProdLoginService()'...'x.doSomething()'。這使用「告訴別人問題」的方法。對isRunningTests進行大量檢查並不會很好。你可以使用一個環境變量來存儲你正在工作的環境。 –

回答

1

我的工作液

static var isRunningTests : Bool { 
    get { 
     return NSClassFromString("XCTest") != nil; 
    } 
} 
1

單元測試,你可以使用;

func isTesting() -> Bool { 
    if ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] == nil { 
     return false 
    } 
    return true 
} 
相關問題