Jef*_*f B 11 .net unit-testing anti-patterns interface mocking
关于单元测试,我被告知生产代码中不应包含与测试相关的代码.
好吧,我觉得每次尝试进行单元测试时我都违反了规则.
我的集会内部有一个班级Xyzzy.我希望依赖将它注入另一个类然后将其存根,以便我可以隔离测试另一个类,所以我创建了一个接口IXyzzy.哎呀,现在我的代码在生产中真正只用于测试.更糟糕的是,我有点违背了什么界面(描述了实施者可以做什么,而不是它是什么).Xyzzy的公共界面和IXyzzy完全相同,没有其他人(除了存根)实现IXyzzy.
这对我来说似乎是一件坏事.
我可以创建一个抽象基类或者创建我想要在Xyzzy Overridable/ 上测试的所有公共方法virtual,但是由于Xyzzy不是为继承而设计的,并且从YAGNI角度来看,它也不会继承.
是否仅为了测试反模式而创建单实施者接口?还有更好的选择吗?
拥有仅用于测试的代码并没有错.这实际上是正常的,就像生产代码包含仅用于调试和生产监控的功能一样.没有明确的理由不允许这样做.代码应该支持应用程序生命周期的所有方面.测试只是生命周期的另一部分.
从这个意义上说,使用接口的方法是正确的.如果您使生产应用程序的其余部分也使用接口(而不是具体类,尽管只有一个),它在架构上是合理的.
我有点反对什么是接口(描述实现者可以做什么,而不是它是什么)
我没有明白你的意思,因为界面确实描述了对象可以做什么.只有一个具体(生产)实现不会破坏此属性.
如果你仔细想想,每个类都有一个松散意义上的"接口":所有方法的公共签名都暴露了一个类支持外部的接口.是否实现.NET接口只是一个细节.班级仍然向外界做出同样的承诺.
| 归档时间: |
|
| 查看次数: |
557 次 |
| 最近记录: |