我正在以功能方式使用依赖倒置(即使用闭包而不是协议/接口/纯虚拟),如下所示:
class StatusPoller {
init(api: @escaping (String, String) -> Observable<Data>,
getAccessToken: @escaping () -> String) {
...
}
}
class HeartbeatSender {
init(api: @escaping (String, String) -> Observable<Data>,
getAccessToken: @escaping () -> String) {
...
}
}
class Api {
func pollStatus(id: String, accessToken: String) -> Observable<Data> {
...
}
func sendHeartbeat(id: String, accessToken: String) -> Observable<Data> {
...
}
}
这就是问题所在。在依赖注入解析器(Swinject)中,它是这样的:
container.register(StatusPoller.self) { _ in
let api = SwinjectApi.container.resolve(Api.self)!
let authStore = SwinjectAuth.container.resolve(AuthStore.self)!
return StatusPoller(api: api.pollStatus(id:accessToken:),
getAccessToken: authStore.getAccessToken)
}
container.register(HeartbeatSender.self) { _ in
let api = SwinjectApi.container.resolve(Api.self)!
let authStore = SwinjectAuth.container.resolve(AuthStore.self)!
return StatusPoller(api: api.pollStatus(id:accessToken:),
getAccessToken: authStore.getAccessToken)
}
我不小心对不同类的 API 成员使用了相同的依赖项。幸运的是(或不幸的是,取决于您的 POV),它现在可以正常工作将近一年,因为后端并没有真正检查心跳一致性(或根本没有检查)。然而,最近几个月有一个新功能需要一直检查客户端的心跳,这导致了一个错误。在我注意到由于上述错误而实际上根本没有发送心跳之后,我修复了它。
所以我的问题是:我将来如何防止这种情况发生?测试依赖注入?但是,怎么办?我仍然不明白如何确保我注入了正确的依赖项。
谢谢
编辑: 为了使问题更清楚,它基本上与此等效,但在功能上:
假设我有一个这样的界面:
protocol VoipHandlerInterface {
...
}
class TwilioVoipHandlerAdapter: VoipHandlerInterface {
...
}
class AsteriskVoipHandlerAdapter: VoipHandlerInterface {
...
}
class VoipManagerInteractor {
let voipHandler: VoipHandlerInterface
init(voipHandler: VoipHandlerInterface) {
self.voipHandler = voipHandler
}
}
例如,我如何测试/确保我在 VoipManagerInteractor
中使用 Twilio 而不是 Asterisk?