我可能以错误的方式接近这个,但我想为单元测试目的引入依赖注入,为了做到这一点,我需要传递一个类作为参数。在某些伪代码中,它应该如下所示:
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)
等等,没有任何效果。
目标是建立一个系统:
答案 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()) {
请注意两个示例中的()
。