通过将类作为函数参数传递来调用类方法来进行Swift依赖注入

时间:2018-04-01 23:15:38

标签: swift class types dependency-injection

我可能以错误的方式接近这个,但我想为单元测试目的引入依赖注入,为了做到这一点,我需要传递一个类作为参数。在某些伪代码中,它应该如下所示:

protocol LocalSavingProtocol {
    static func saveDataLocally()
}

class ProductionClass: LocalSavingProtocol {
    static func saveDataLocally() {
        print("actually save data")
    }
}

class TestClass: LocalSavingProtocol {
    static func saveDataLocally() {
        print("test saving data")
    }
}

func saveEverywhere(injecting localSavingClass: LocalSavingProtocol = ProductionClass) {
    localSavingClass.saveDataLocally()
}

//production code
saveEverywhere()

//test
saveEverywhere(injecting: TestClass)

显然这不起作用,尽管我尝试传递.Type.self,但将saveEverywhere功能更改为

saveEverywhere<T: LocalSavingProtocol>(injecting localSavingClass: T)

等等,没有任何效果。

目标是建立一个系统:

  1. 我可以在测试代码时注入一个类
  2. 我不必在生产代码中注入类(即有默认值)
  3. 我可以在注入的类
  4. 上调用类方法

2 个答案:

答案 0 :(得分:2)

protocol LocalSavingProtocol {
    static func saveDataLocally()
}

class ProductionClass: LocalSavingProtocol {
    class func saveDataLocally() {
        print("actually save data")
    }
}

class TestClass: LocalSavingProtocol {
    class func saveDataLocally() {
        print("test saving data")
    }
}

func saveEverywhere(injecting localSavingClass: LocalSavingProtocol.Type = ProductionClass.self) {
    localSavingClass.saveDataLocally()
}

//production code
saveEverywhere()

//test
saveEverywhere(injecting: TestClass.self)

答案 1 :(得分:0)

依赖注入不涉及传入类,它会注入一个其他东西可以依赖的对象,因此单词 dependency 。这对单元测试有用的原因是您可以将代码封装到单独的对象中。

您正尝试从类型访问实例方法。依赖注入不需要传入类类型。而是传入一个对象:

saveEverywhere(injecting: TestClass())

对于默认值,也使用对象:

func saveEverywhere(injecting localSavingClass: LocalSavingProtocol = ProductionClass()) {

请注意两个示例中的()