测试依赖注入

时间:2021-06-26 01:21:59

标签: ios unit-testing testing dependency-injection

我正在以功能方式使用依赖倒置(即使用闭包而不是协议/接口/纯虚拟),如下所示:

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?

0 个答案:

没有答案