【发布时间】:2017-06-29 11:15:27
【问题描述】:
我是一位经验丰富的 Objective-c 程序员,但我不能对 Swift 说同样的话,在不使用 OCMock 之类的框架的情况下,我很难在 swift 中对一个类进行单元测试。
问题:我正在将 Firebase 集成到一个混合的 Objective-C/Swift 项目中,我需要根据应用的构建配置对其进行配置。
我为此编写了一个 Swift 类(将由 obj-c 应用程序委托使用),但是由于 firebase 框架是通过静态类方法配置的,确切地说是FIRApp.configure(with: FIROptions),我需要模拟这个方法以某种方式对其进行单元测试。
我的代码,没有任何依赖注入句柄,看起来像这样:
@objc class FirebaseConfigurator: NSObject{
func configureFirebase(){
let config = configManager.buildConfiguration
var optionsPlistBaseName = getPlistName()
let optionsFile = Bundle.main.path(forResource: optionsPlistBaseName, ofType: "plist")
guard let opts = FIROptions(contentsOfFile: optionsFile) else{
assert(false, "fatal: unable to load \(optionsFile)")
return
}
FIRApp.configure(with: opts)
}
func getPlistName() -> String{
// retrieves correct plist name and returns it
}
}
我已经进行了一些研究,但到目前为止我没有找到任何适合我的解决方案,但是我正在考虑以下之一:
- 我可以传递一个默认为
FIRApp.configure(with:)的函数,但是我应该从objective-c 执行此操作,并且该函数还接受一个参数,我在语法上遇到了困难 - 我可以在 FIRApp 周围使用包装器,但我想避免它,除非唯一可行的清洁解决方案。
- 我可以继续使用协议并进行依赖倒置,但是作为静态方法,我又在语法上苦苦挣扎,我找不到使用带有静态方法的模拟类进行 DI 的简单方法。李>
作为参考(个人和可能需要它的人),这些是我发现有用的一些资源,我将继续挖掘:
同时,我们将非常感谢您的每一次帮助。
作为旁注,有很多方法可以解决这个问题,而不用苦于模拟静态类方法,但我的目的是找到一种模拟它的方法,以便更好地理解最佳实践测试更复杂的情况。
【问题讨论】:
标签: swift unit-testing dependency-injection xctest swift-protocols