相关疑难解决方法(0)

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

我是一名经验丰富的Objective-c程序员,但我不能对Swift说同样的话,我很难在不使用像OCMock这样的框架的情况下在swift中测试一个类.

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

我为此编写了一个Swift类(将由obj-c app委托使用),但是由于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
    }

}
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,但到目前为止我没有发现任何适合我的解决方案,但我想到的是以下其中一项:

  • 我可以传递一个默认的函数FIRApp.configure(with:)但是我应该从objective-c执行此操作并且函数也接受一个参数,我正在努力学习语法
  • 我可以在FIRApp周围使用包装器,但我想避免它,除非唯一可行的清洁解决方案.
  • 我可以继续使用协议并进行依赖性反转,但是作为静态的方法我再次遇到语法,我找不到一个简单的方法来使用静态方法对模拟类进行DI.

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

同时,每一个帮助都会非常感激.

作为旁注,有很多方法可以解决这个问题而不用嘲笑静态类方法,但我的目标是找到一种嘲弄它的方法,以便在测试更复杂时更好地理解最佳实践的情况.

unit-testing dependency-injection xctest swift swift-protocols

10
推荐指数
1
解决办法
1909
查看次数