我可能会以错误的方式处理这个问题,但我想引入依赖注入(inject)以进行单元测试,并且为了做到这一点,我需要传递一个类作为参数。在某种伪代码中,它应该如下所示:
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)
等等,没有任何效果。
目标是建立一个系统:
- 我可以在测试代码时注入(inject)一个类
- 我不必在生产代码中注入(inject)该类(即有一个默认值)
- 我可以在注入(inject)的类上调用类方法
最佳答案
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)
关于通过将类作为函数参数传递来调用类方法的 Swift 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49603504/