我正在开发一个有很多外部服务消息传递的项目.仅以略微"双曲线"方式描述它的一种好方法是系统必须向Flicker API,Facebook API和Netflix API发送消息的应用程序.
为了支持断开连接的场景,日志记录问题,开发人员可用性,配置等...我已经尝试使用一种大量使用泛型和表达式树的方法.最终结果如下:
Messenger.SendCustom( netflix => netflix.RecommendMovie("my message"));
总的来说,我对最终结果感到满意,但感觉我犯了一个错误,或者忽略了一个关于测试和断开连接的场景的设计主管.
在测试过程中,无论是基于自动化,单元还是人工,我都实现了一个最初使用DI在"实时模式"中执行正确操作的对象工厂,并使用Mocks提供了一种无效的信使,它在所有在测试模式下.
我只看过或读过关于Mocks在纯TDD模式下使用而不习惯是一种愚蠢的对象.我见过的方法将围绕存根或模拟我正在使用的所有API所依赖的HTTP通信功能.
我主要担心的是,我期望连接到的所有不同服务是否最终都需要进行大量细化工作来替代特定的HTTP实现,如果我使用存根方法,我将为每个服务提供3个类(IService,ConcreteService,StubService)并在实现新方法或更改任何内容时维护它们将是真正的PITA.
在当前的实现中,我使用Mocks免费获得"无菌模式",几乎不需要为了符合某个测试主体而实现任何额外的功能.
问题是我错过了什么吗?我是否以更方便的方式使用Mocks侵犯了设计主体?
任何人都可以提供任何关于如何从许多不同的外部服务中获得无菌模式的建议,而不会跳过很多箍?
这个问题有意义吗?
感谢所有的答案.
编辑#1:
我原来的问题并不清楚.任何null或mock对象都将纯粹用于开发/调试/测试环境中.在生产中,发送这些消息的代码将是它们的实际实现.
我投票给大家,因为这个问题似乎有很多不同的解决方案,我会探索每个问题.
请不要认为这个问题已经回答了,我会尽可能多地了解我的建议.
有一种名为Null Object的设计模式.null对象是实现Interface的对象,因此它可以在像您这样的场景中使用.
关于Null对象的重要一点是不要在可能破坏系统的地方返回null.
Null对象的目的是有一个虚空和简单的实现,就像模拟一样,但是要在生产环境中使用.
最简单的例子是这样的:
class Logger{ private static ILogger _Logger; static Logger(){ //DI injection here _Logger = new NullLogger(); //or _Logger = new TraceLogger(); } } interface ILogger{ void Log(string Message); } internal class TraceLogger:ILooger{ public void Log(string Message){ //Code here } } internal class NullLogger{ public void Log(string Message){ //Don't don anything, in purporse } }
我希望这可以帮到你