2017-05-24 94 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 
}