我正在从事一个有很多外部服务消息传递的项目。用稍微“双曲线”的方式来描述它的一个好方法是系统必须向 Flicker API、Facebook API 和 Netflix API 发送消息的应用程序。
为了支持断开连接的场景、日志记录、开发人员可用性、配置等……我尝试了一种大量使用泛型和表达式树的方法。最终结果如下所示:
Messenger<NetflixApi>.SendCustom( netflix => netflix.RecommendMovie("my message"));
总的来说,我对最终结果很满意,但我觉得我犯了一个错误,或者在测试和断开连接的场景方面忽略了某个地方的设计原则。
在测试期间,无论是自动化的、单元的还是基于人的,我都实现了一个对象工厂,它最初使用 DI 在“实时模式”中执行正确的操作,并使用 Mocks 提供一种不做任何事情的无菌信使所有在测试模式下。
我只看到或读过 Mocks 在纯 TDD 模式下使用,而不是被用作某种愚蠢的对象。我看到的方法将围绕着对我使用的所有 API 所依赖的 HTTP 通信功能进行存根或模拟。
我主要担心的是,我希望连接的所有不同服务最终将不得不做很多细粒度的工作来替换特定的 HTTP 实现,如果我使用存根方法,我将为这些服务中的每一个提供 3 个类( IService、ConcreteService、StubService )并在实现新方法或更改任何内容时维护它们将是真正的 PITA。
在当前的实现中,我使用 Mocks 来免费获得“无菌模式”,几乎无需为了符合某个测试主体而实现任何额外的东西。
问题是我错过了什么吗?我是否以更方便的方式使用 Mocks 违反了设计原则?
任何人都可以就如何从许多不同的外部服务中获得无菌模式提供任何建议,而无需跳过很多圈子?
这个问题有意义吗?
感谢所有的答案。
编辑#1:
我最初的问题并不清楚。任何空对象或模拟对象都将纯粹用于开发/调试/测试环境。在生产中,发送这些消息的代码将是它们的实际实现。
我对每个人都投了赞成票,因为对于这个问题似乎有很多不同的解决方案,我将探索每一个。
请不要认为这个问题已经得到回答,我会尽可能多地获得建议。