gpt4 book ai didi

swift - 以快速的方式在快速单元测试中模拟静态类方法?

转载 作者:IT王子 更新时间:2023-10-29 05:37:25 25 4
gpt4 key购买 nike

我是一名经验丰富的 Objective-c 程序员,但我不能对 Swift 说同样的话,我很难在不使用 OCMock 等框架的情况下对 Swift 中的类进行单元测试。

问题:我正在将 Firebase 集成到混合的 Objective-C/Swift 项目中,我需要根据应用程序的构建配置对其进行配置。

我已经为此编写了一个 Swift 类(将由 obj-c 应用程序委托(delegate)使用),但是由于 firebase 框架是通过静态类方法配置的,正是 FIRApp.configure(with: FIROptions ),我需要以某种方式模拟此方法以便对其进行单元测试。

我的代码,没有任何依赖注入(inject)句柄,看起来像这样:

@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 周围使用包装器,但我想避免使用它,除非是唯一可行的干净解决方案。
  • 我可以继续使用协议(protocol)并进行依赖倒置,但是作为静态方法,我再次在语法上苦苦挣扎,我找不到一种简单的方法来使用带有静态方法的模拟类进行 DI。<

作为引用(个人和可能需要它的人),这些是我发现有用的一些资源,我将继续挖掘这些资源:

与此同时,我们将不胜感激。

作为旁注,有很多方法可以解决这个问题,而不必费力地模拟静态类方法,但我的目的是找到一种模拟它的方法,以便更好地理解最佳实践测试更复杂的情况。

最佳答案

你确实可以做到这些。

闭包论证

您可以让您的 configureFirebase 函数采用默认为您最初使用的“applier”闭包:

func configureFirebase(
using apply: (_ options: FIROptions) -> Void
= { opts in FIRApp.configure(opts) }
) {
// building |opts| as before
// Now replace this: FIRApp.configure(with: opts)
apply(opts)
}

协议(protocol)

您需要一个Configurable 协议(protocol),然后在默认情况下使FIRApp 符合它:

protocol Configurable {
static func configure(with options: FIROptions)
}

extension FIRApp: Configurable {}

class FirebaseConfigurator {
var configurable: Configurable
init(configurable: Configurable = FIRApp) {
self.configurable = configurable
}

func configureFirebase() {
//load |opts|…
configurable.configure(with: opts)
}
}

如果您只是打算在一个方法中使用它,那么它只是 transient ,它应该是一个函数参数而不是存储的属性。

(如果不清楚它是持久状态还是 transient 状态,因为类的全部意义在于调用单个函数,也许您甚至不需要类,只需要一个函数。)

关于swift - 以快速的方式在快速单元测试中模拟静态类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42170690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com