我有一个在1个主要班级和2个较小的班级中重构的班级。主要类使用数据库(就像我的许多类一样)并发送电子邮件。因此,主要类别有一个IPersonRepository
和一个IEmailRepository
注入,后者又将其发送给2个较小的类别。
现在,我想对主类进行单元测试,并且学会了不对类的内部工作进行单元测试,因为我们应该能够在不破坏单元测试的情况下更改内部工作。
但作为类使用IPersonRepository
和IEmailRepository
,我HAVE指定一些方法为(模拟/虚拟)的结果IPersonRepository
。主类基于现有数据计算一些数据并将其返回。如果要测试,我不知道如何在不指定IPersonRepository.GetSavingsByCustomerId
返回值x的情况下编写测试。但是,然后我的单元测试“知道”内部工作原理,因为它“知道”了哪些方法可以模拟,哪些方法不可以。
如何在不了解内部原理的情况下测试已注入依赖项的类?
背景:
以我的经验,像这样的许多测试会为存储库创建模拟,然后为模拟提供正确的数据,或者测试执行期间是否调用了特定方法。无论哪种方式,测试都会了解内部信息。
现在,我已经看到了有关理论的演示文稿(我以前已经听说过),即测试不应该知道实现的知识。首先,因为你不是测试如何它的工作原理,而且还因为当你改变现在所有的单元测试失败,因为他们“知道”关于落实执行。尽管我喜欢测试的概念不了解实现的概念,但我不知道如何实现。
IPersonRepository
对象,该接口及其描述的所有方法就不再是“内部”的了,因此这实际上不是测试的问题。您真正的问题应该是“如何将类重构为较小的单元,而又不会在公共场合公开太多”。答案是“保持那些接口精简”(例如,通过坚持接口隔离原则)。这就是@DavidArno答案中的恕我直言第二点(我想我不需要在另一个答案中重复这一点)。