单个实现者接口是否用于单元测试反模式?

Jef*_*f B 11 .net unit-testing anti-patterns interface mocking

关于单元测试,我被告知生产代码中不应包含与测试相关的代码.

好吧,我觉得每次尝试进行单元测试时我都违反了规则.

我的集会内部有一个班级Xyzzy.我希望依赖将它注入另一个类然后将其存根,以便我可以隔离测试另一个类,所以我创建了一个接口IXyzzy.哎呀,现在我的代码在生产中真正只用于测试.更糟糕的是,我有点违背了什么界面(描述了实施者可以做什么,而不是它什么).Xyzzy的公共界面和IXyzzy完全相同,没有其他人(除了存根)实现IXyzzy.

这对我来说似乎是一件坏事.

我可以创建一个抽象基类或者创建我想要在Xyzzy Overridable/ 上测试的所有公共方法virtual,但是由于Xyzzy不是为继承而设计的,并且从YAGNI角度来看,它也不会继承.

是否仅为了测试反模式而创建单实施者接口?还有更好的选择吗?

usr*_*usr 6

拥有仅用于测试的代码并没有错.这实际上是正常的,就像生产代码包含仅用于调试和生产监控的功能一样.没有明确的理由不允许这样做.代码应该支持应用程序生命周期的所有方面.测试只是生命周期的另一部分.

从这个意义上说,使用接口的方法是正确的.如果您使生产应用程序的其余部分也使用接口(而不是具体类,尽管只有一个),它在架构上是合理的.

我有点反对什么是接口(描述实现者可以做什么,而不是它是什么)

我没有明白你的意思,因为界面确实描述了对象可以做什么.只有一个具体(生产)实现不会破坏此属性.

如果你仔细想想,每个类都有一个松散意义上的"接口":所有方法的公共签名都暴露了一个类支持外部的接口.是否实现.NET接口只是一个细节.班级仍然向外界做出同样的承诺.